另外,如果不是 python 或 java,那么您更一般会选择静态类型语言还是动态类型语言?
11 回答
我会选择 JVM 而不是 python,主要是因为 Python 中的多线程受到Global Interpreter Lock的阻碍。但是,在 JVM 上运行时,Java 不太可能是您的最佳选择。Clojure或Scala(使用演员)都可能更适合多线程问题。
如果您确实选择了 Java,您应该考虑使用java.util.concurrent库并避免使用多线程原语,例如synchronized。
绝对无堆栈 Python!这是一个 Python 变体,专门用于并发性。
但最终它取决于您的目标平台以及您想要实现的目标。
对于并发,我会使用 Java。通过使用 Java,我实际上是指Scala,它从 Erlang 的并发构造中借用了很多东西,但(可能)对于以前从未使用过任何一种的 Java 开发人员来说更容易使用。
Python 线程不得不等待全局解释器锁,这使得 CPU 绑定程序无法实现真正的并发(在单个进程内)。据我了解,Stackless Python 解决了 CPython 的一些(尽管不是全部)并发缺陷,但由于我没有使用过它,所以我真的无法给出建议。
如果不是 Java/Python,我会选择一种函数式语言,因为考虑副作用是编写并发软件的复杂性之一。(就您的问题而言:这个恰好是静态类型的,但编译器大部分时间都在推断)
就我个人而言,我会选择 F#,因为我已经看到很多很好的例子,可以轻松使用它来编写并发软件。
作为介绍:这个人既有趣又鼓舞人心,如果您对 F# 不感兴趣,甚至必须看到。
我会通过 Jython 使用 Java。Java 具有强大的线程功能,并且可以使用 Python 语法和 Jython 编写它,因此您可以两全其美。
Python 本身在并发方面并不是很好,而且无论如何都比 Java 慢。
但是如果你有并发问题和空闲的手,我会看看 Erlang,因为它是为这些问题设计的。当然,只有在满足以下条件时才必须考虑 Erlang:
- 是时候掌握一项(非常)新技术了
- 控制生产链的合理部分,因为 Erland 需要在您的工具箱中进行一些调整以适应
对于某些任务,Python 太慢了。在多核计算机上,您的单线程 Java 程序可能比 Python 的并发版本更快......
我想使用 Java 或 Scala、F# 或直接使用 C++(MPI 和 OpenMPI)。
Java 环境(JVM + 库)在并发方面比(C)Python 更好,但 Java 语言很烂。我可能会在 JVM 上使用另一种语言——已经提到过 Jython,Clojure 和 Scala 都对并发提供了出色的支持。
Clojure 特别好——它支持高性能持久数据结构、代理和软件事务内存。它是一种动态语言,但您可以给它类型提示以获得与 Java 一样好的性能。
观看Richard Hickey(Clojure 的创建者)在 InfoQ 上关于传统并发方法的问题以及 Clojure 如何处理它的视频。
我会看看 Objective-C 和 Foundation Framework。异步、并发编程很好地提供了。
这当然取决于您对 Apple 的开发人员工具或 GnuStep 的访问权限,但如果您可以访问其中任何一个,那么这是进行并发编程的好方法。
答案是视情况而定。例如,您是想在单台机器上利用多个内核或 CPU,还是希望将任务分布在多台机器上?速度与易于实施有多重要?
如前所述,Python 具有全局解释器锁,但您可以使用多处理模块。请注意,虽然Stackless非常酷,但它不会单独使用多个内核。Python 通常被认为比 Java 更容易使用。如果速度是优先级,Java 通常更快。
Java 中的java.util.concurrent
库使在单台机器上编写并发应用程序变得更简单,但您仍然需要围绕任何共享状态进行同步。虽然 Java 不一定是最好的并发语言,但有很多工具、库、文档和最佳实践可以提供帮助。
使用消息传递和不变性而不是线程和共享状态被认为是编写并发应用程序的更好方法。因此,通常首选不鼓励可变性和副作用的函数式语言。如果需要将并发应用程序分布在多台机器上,那么值得研究为此设计的运行时,例如Erlang或Scala Actors。