9

另外,如果不是 python 或 java,那么您更一般会选择静态类型语言还是动态类型语言?

4

11 回答 11

28

我会选择 JVM 而不是 python,主要是因为 Python 中的多线程受到Global Interpreter Lock的阻碍。但是,在 JVM 上运行时,Java 不太可能是您的最佳选择。ClojureScala(使用演员)都可能更适合多线程问题。

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

于 2009-12-07T17:32:18.007 回答
11

绝对无堆栈 Python!这是一个 Python 变体,专门用于并发性。

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

于 2009-12-07T17:27:23.413 回答
11

对于并发,我会使用 Java。通过使用 Java,我实际上是指Scala,它从 Erlang 的并发构造中借用了很多东西,但(可能)对于以前从未使用过任何一种的 Java 开发人员来说更容易使用。

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

于 2009-12-07T17:32:53.780 回答
5

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

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

我不了解 Python,但 Java 以及内置的锁和线程模型,有一个名为Kilim的消息传递框架。

于 2009-12-07T17:30:45.340 回答
4

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

就我个人而言,我会选择 F#,因为我已经看到很多很好的例子,可以轻松使用它来编写并发软件。

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

于 2009-12-07T17:27:31.013 回答
2

我会通过 Jython 使用 Java。Java 具有强大的线程功能,并且可以使用 Python 语法和 Jython 编写它,因此您可以两全其美。

Python 本身在并发方面并不是很好,而且无论如何都比 Java 慢。

但是如果你有并发问题和空闲的手,我会看看 Erlang,因为它是为这些问题设计的。当然,只有在满足以下条件时才必须考虑 Erlang:

  • 是时候掌握一项(非常)新技术了
  • 控制生产链的合理部分,因为 Erland 需要在您的工具箱中进行一些调整以适应
于 2009-12-07T17:31:29.690 回答
2

两者都不。众所周知,并发编程很难正确。可以选择使用面向过程的编程语言,例如occam-pi,它基于通信顺序过程pi 演算的思想。这允许编译时检查死锁和并发系统开发过程中出现的许多其他问题。如果你不喜欢 occam-pi,如果你不喜欢,我不能怪你,你可以尝试Go来自谷歌的新语言,它也实现了 CSP 的一个版本。

于 2009-12-07T20:40:39.107 回答
1

对于某些任务,Python 太慢了。在多核计算机上,您的单线程 Java 程序可能比 Python 的并发版本更快......

我想使用 Java 或 Scala、F# 或直接使用 C++(MPI 和 OpenMPI)。

于 2009-12-07T17:38:43.407 回答
1

Java 环境(JVM + 库)在并发方面比(C)Python 更好,但 Java 语言很烂。我可能会在 JVM 上使用另一种语言——已经提到过 Jython,Clojure 和 Scala 都对并发提供了出色的支持。

Clojure 特别好——它支持高性能持久数据结构、代理和软件事务内存。它是一种动态语言,但您可以给它类型提示以获得与 Java 一样好的性能。

观看Richard Hickey(Clojure 的创建者)在 InfoQ 上关于传统并发方法的问题以及 Clojure 如何处理它的视频。

于 2009-12-07T17:54:17.710 回答
1

我会看看 Objective-C 和 Foundation Framework。异步、并发编程很好地提供了。

这当然取决于您对 Apple 的开发人员工具或 GnuStep 的访问权限,但如果您可以访问其中任何一个,那么这是进行并发编程的好方法。

于 2009-12-07T18:46:01.570 回答
1

答案是视情况而定。例如,您是想在单台机器上利用多个内核或 CPU,还是希望将任务分布在多台机器上?速度与易于实施有多重要?

如前所述,Python 具有全局解释器锁,但您可以使用多处理模块。请注意,虽然Stackless非常酷,但它不会单独使用多个内核。Python 通常被认为比 Java 更容易使用。如果速度是优先级,Java 通常更快。

Java 中的java.util.concurrent库使在单台机器上编写并发应用程序变得更简单,但您仍然需要围绕任何共享状态进行同步。虽然 Java 不一定是最好的并发语言,但有很多工具、库、文档和最佳实践可以提供帮助。

使用消息传递和不变性而不是线程和共享状态被认为是编写并发应用程序的更好方法。因此,通常首选不鼓励可变性和副作用的函数式语言。如果需要将并发应用程序分布在多台机器上,那么值得研究为此设计的运行时,例如ErlangScala Actors

于 2010-01-03T14:52:51.487 回答