另外,如果不是python或java,那么你会更常选择静态类型语言或动态类型语言吗?
答案 0 :(得分:26)
我会选择JVM over python,主要是因为Global Interpreter Lock阻碍了Python中的多线程。但是,在JVM上运行时,Java不太可能是您的最佳选择。 Clojure或Scala(使用演员)可能更适合多线程问题。
如果选择Java,则应考虑使用java.util.concurrent库并避免多线程原语,例如 synchronized 。
答案 1 :(得分:11)
定义Stackless Python!这是一个特别为并发而制作的Python变体。
但最终它取决于您的目标平台以及您要实现的目标。
答案 2 :(得分:10)
对于并发性,我会使用Java。通过使用Java,我实际上是指Scala,它从Erlang的并发结构中借用了很多东西,但对于以前从未使用过的Java开发人员来说(可能)更容易访问。
Python线程不得不等待全局解释器锁,使得CPU绑定程序无法实现真正的并发(在单个进程内)。据我所知,Stackless Python解决了一些(尽管不是全部)CPython的并发缺陷,但由于我没有使用它,我无法真正建议它。
答案 3 :(得分:5)
我认为这个论点不是关于语言选择或静态或动态类型 - 它是在两种并发模型之间 - 共享内存和消息传递。哪种型号在您的情况下更有意义?您选择的语言是否允许您做出选择,或者您是否被迫采用一种模式而不是另一种模式?
为什么不查看Erlang(具有动态类型)和message passing,Actor model,并阅读原因Joe Armstrong doesn't like shared memory。还有一个关于使用锁和线程here on SO的java并发的有趣讨论。
我不了解Python,但是Java,以及内置的锁和线程模型,都有一个名为Kilim的mesasge传递框架。
答案 4 :(得分:4)
如果不是Java / Python我会选择功能语言,因为考虑副作用是编写并发软件的复杂性之一。 (就你的问题而言:这个问题恰好是静态类型的,但编译器大多数情况下都是伪装的)
就我个人而言,我会选择F#,因为我已经看到了很多很好的编写并发软件的好例子。
作为一个介绍:这个人是equally fun as inspiring,如果你对F#不感兴趣,甚至必须看到。
答案 5 :(得分:2)
我会通过Jython使用Java。 Java具有强大的线程功能,可以使用Jython的Python语法编写,因此您可以充分利用这两个世界。
Python本身对并发性并不是很好,并且反正比Java慢。
但是如果你有并发问题和自由发挥,我会看看Erlang,因为它是针对这些问题设计的。当然,只有在有以下情况时才必须考虑Erlang:
答案 6 :(得分:2)
都不是。众所周知,并发编程很难纠正。可以选择使用面向过程的编程语言,如occam-pi,它基于communicating sequential processes和pi calculus的概念。这允许编译时检查死锁以及在并发系统开发期间出现的许多其他问题。如果你不喜欢occam-pi,我不能责怪你,如果你不这样做,你可以尝试Go来自谷歌的新语言,它也实现了一个CSP版本。
答案 7 :(得分:1)
对于某些任务,Python太慢了。您的单线程Java程序可能比多核计算机上的并发Python版本更快......
我想使用Java或Scala,F#或简单地使用C ++(MPI和OpenMPI)。
答案 8 :(得分:1)
Java环境(JVM +库)比(C)Python更适合并发,但Java语言很糟糕。我可能会在JVM上使用另一种语言 - 已经提到过Jython,Clojure和Scala都对并发性有很好的支持。
Clojure特别好 - 它支持高性能持久数据结构,代理和软件事务内存。它是一种动态语言,但你可以给它提供类型提示,以获得与Java一样好的性能。
在RichardQ关注传统的并发方法问题以及Clojure如何处理它的问题上,在InfoQ上观察this video。
答案 9 :(得分:1)
我会看看Objective-C和Foundation Framework。提供了异步的并发编程。
这当然取决于您对Apple开发人员工具或GnuStep的访问权限,但如果您可以访问其中任何一个,那么这是一个很好的并行编程路径。
答案 10 :(得分:1)
答案是,这取决于。例如,您是尝试在单台计算机上利用多个核心还是cpus,还是希望在多台计算机上分配任务?速度与易于实施有多重要?
如前所述,Python具有Global Interpreter Lock,但您可以使用multiprocessing模块。请注意,虽然Stackless非常酷,但它won't utilise multiple cores本身就很酷。 Python通常比Java更容易使用。如果速度是优先级,Java通常会更快。
Java中的java.util.concurrent
库使得在单个机器上编写并发应用程序变得更加简单,但您仍需要围绕任何共享状态进行同步。虽然Java不一定是最好的并发语言,但是有很多工具,库,文档和最佳实践可以提供帮助。
使用消息传递和不变性而不是线程和共享状态被认为是编写并发应用程序的更好方法。结果通常优选阻止可变性和副作用的功能语言。如果需要跨多台计算机分发并发应用程序,则值得查看为此设计的运行时。 Erlang或Scala Actors。