Functional programming 什么函数语言实现允许线程并行运行?

Functional programming 什么函数语言实现允许线程并行运行?,functional-programming,parallel-processing,Functional Programming,Parallel Processing,ocamlgc强制使用一个全局锁,防止变种(线程)并行运行,尽管它们可以并发(交错)运行。我相信SML/NJ和MLton也是如此,但PolyML、GHC、F#、Clojure和Scala却不是如此 还有哪些函数式语言实现允许线程并行运行?Haskell via我很高兴地告诉您,您是对的,基于CLR的F#根本不受该限制,而是受益于多线程特定功能,包括和即将推出的精彩(.NET 4.0)任务并行库。Scala和Clojure都在JVM上运行,这允许真正的并发而没有任何单点争用瓶颈。除了Haskell

ocamlgc强制使用一个全局锁,防止变种(线程)并行运行,尽管它们可以并发(交错)运行。我相信SML/NJ和MLton也是如此,但PolyML、GHC、F#、Clojure和Scala却不是如此


还有哪些函数式语言实现允许线程并行运行?

Haskell via

我很高兴地告诉您,您是对的,基于CLR的F#根本不受该限制,而是受益于多线程特定功能,包括和即将推出的精彩(.NET 4.0)任务并行库。

Scala和Clojure都在JVM上运行,这允许真正的并发而没有任何单点争用瓶颈。

除了Haskell之外,您还可以在Erlang(面向并发的编程)中并发运行进程您也可以在F#中使用and来实现这一点。

Erlang实现自己的进程和进程调度,并允许数千、几万甚至数百万个Erlang进程(在单个操作系统进程内)

在SMP和多核机器中,Erlang虚拟机将向其进程调度器和进程队列分配尽可能多的OS线程和OS进程,以最大限度地利用硬件体系结构中的底层并发操作


当然,向应用程序公开的并发范例保持不变。

有许多好的实现。目前,哈斯凯尔人似乎得到了最好的结果(参见)。Erlang紧随其后,特别是如果您想要分布式的话


在六到十二个月内,答案可能会发生变化:-)

python不是一种特别的函数式语言,而且与GIL也不是很并行,但与模块(自2.6以来的标准)结合在一起,两者都有,但它没有纯函数式语言那么优雅


只是一些补充,以确认推测列表的其他部分:

  • Poly/ML自版本5.2(2006年起)起支持本机线程(POSIX线程或Windows线程)。当前的Poly/ML 5.5(2012年夏季)改进了对并行内存管理的支持:一些GC阶段使用多线程,特别支持在线共享不可变值,以减少大型应用程序的内存占用

  • Isabelle/ML为Poly/ML线程提供了一个附加的未来库。Isabelle是一个交互式定理证明者,但它与基于Poly/ML的扩充版SML集成在一起


Data Parallel Haskell仍处于试验阶段,但第一个链接中的并行线程支持要成熟得多。DPH是用并行线程实现的,而不是用并行线程实现的。我没想到这个响应会非常流行,但请解释一下您对这项技术有什么不满?我的问题是专门针对线程而不是进程的。CPython有一个问题涉及并发内核线程,妨碍了它的充分使用。多处理模块允许您使用与进程几乎相同的接口而不是线程来实现几乎相同的结果。这个问题在其他风格的python中不存在,因为它们缺少GIL。我知道。OCaml也有同样的问题。这正是我想要逃避的!:-)你能推荐一个关于Scala中并行编程的链接吗?如果你喜欢这个模型,Scala支持Actor,你可以像在java中一样使用java.util.concurrency。我想问题是关于函数式编程的,actor更合适。那些Haskell结果毫无价值:它们的并行实现通常比大多数串行实现慢几个数量级。@Jon:你的证据在哪里?将你引用的论文中引用的性能度量与用其他语言编写的等效程序进行比较。例如,第二篇文章给出了并行快速排序的性能结果(~14s,仅排序100k整数),比大多数其他语言中的合理解决方案慢100倍。您也可以自己对他们的并行程序进行基准测试。我对Saynte的naive并行化应用于Lennart的四个Haskell my ray tracer实现进行了详尽的研究,发现其中一个在6个核上停止了扩展,而所有其他的都在5个核上停止了扩展。相比之下,我用F#编写了并行线性代数代码,在英特尔硬件上运行时,其性能优于英特尔MKL中的供应商调优Fortran。
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    result = pool.apply_async(f, [10])     # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           # prints "100" unless your computer is *very* slow
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"