Python与Java - 您会选择哪种并发编程?为什么?

Set*_*zer 8 python java concurrency python-stackless

另外,如果不是python或java,那么你会更普遍地选择静态类型语言还是动态类型语言?

joh*_*tok 27

我会选择JVM over python,主要是因为全局解释器锁阻碍了Python中的多线程.但是,在JVM上运行时,Java不太可能是您的最佳选择.ClojureScala(使用actor)都可能更适合多线程问题.

如果选择Java,则应考虑使用java.util.concurrent库并避免使用多线程原语,例如synchronized.

  • 只需要一个以上的解释器即可解决全局解释器锁定问题:D http://docs.python.org/dev/library/multiprocessing.html (4认同)
  • 如果您使用Java,请获取"Java Concurrency in Practice"并准备花费3-4个月的时间来完成它.并发性是任何语言中棘手的问题. (2认同)

hal*_*dan 11

Definetely Stackless Python!这是一个特别为并发而制作的Python变体.

但最终它取决于您的目标平台以及您要实现的目标.


Ben*_*mes 10

对于并发性,我会使用Java.通过使用Java,我实际上是指Scala,它从Erlang的并发结构中借用了很多东西,但对于之前从未使用过的Java开发人员来说(可能)更容易访问.

Python线程不得不等待全局解释器锁,使得CPU绑定程序无法实现真正​​的并发(在单个进程内).据我所知,Stackless Python解决了一些(虽然不是全部)CPython的并发缺陷,但由于我没有使用它,我无法真正建议它.


Pet*_*ter 6

如果不是 Java/Python,我会选择函数式语言,因为考虑副作用是编写并发软件的复杂性之一。(就您的问题而言:这恰好是静态类型,但编译器大多数时候都会推断)

就我个人而言,我会选择 F#,因为我见过很多轻松使用它编写并发软件的好例子。

作为介绍:这个人既有趣又鼓舞人心,如果你对 F# 不感兴趣的话,甚至是必须看看的。

  • F# 不是纯函数式的,您可以用它编写任何程序,而无需编写一行函数式代码。 (2认同)

bla*_*ank 5

我不认为这个论点是关于语言选择或静态或动态类型 - 它是在两种并发模型之间 - 共享内存和消息传递.哪种模式在您的情况下更有意义?您选择的语言是否允许您做出选择,或者您是否被迫采用一种模式而不是另一种模式?

为什么不看看Erlang(具有动态类型)和消息传递,Actor模型,并阅读为什么Joe Armstrong不喜欢共享内存.在SO上使用锁和线程的java并发也有一个有趣的讨论.

我不知道Python,但Java,以及内置的锁和线程模型,有一个名为Kilim的mesasge传递框架.