OCaml GC强制执行全局锁定,以防止mutators(线程)并行运行,尽管它们可以并发运行(交错)。我相信SML / NJ和MLton也是如此,但不是PolyML,GHC,F#,Clojure和Scala。
其他哪些函数式语言实现允许线程并行运行?
答案 0 :(得分:11)
有很多很好的实现。目前,Haskell人似乎获得了最好的结果(见ICFP 2009 paper by Simon Marlow and others以及Haskell Symposium 2009 paper by Donnie Jones and others)。 Erlang非常落后,特别是如果你想分发它。
在六至十二个月内,答案可能已经改变: - )
答案 1 :(得分:6)
答案 2 :(得分:6)
Scala和Clojure都在JVM上运行,它允许真正的并发,没有任何单点争用瓶颈。
答案 3 :(得分:6)
Erlang实现自己的流程和流程计划,并允许数千,数万甚至数百万个Erlang流程(在单个操作系统流程中)。
在SMP和多核机器中,Erlang虚拟机将为其进程调度程序和进程队列分配尽可能多的操作系统线程和操作系统进程,以最大限度地利用硬件体系结构中的底层并发操作。
当然,暴露于应用程序的并发范例保持不变。
答案 4 :(得分:5)
我很高兴地告诉你,你是对的,基于CLR的F#根本没有受到这种限制,而是受益于多线程特定功能,包括async workflows,{ {3}},以及即将推出的(.NET 4.0)任务并行库。
答案 5 :(得分:3)
除了Haskell之外,您还可以在Erlang(面向并发的编程)中同时运行进程,也可以使用.NET Parallel Extensions和Asynchronous Workflows在F#中执行此操作。
答案 6 :(得分:1)
只需添加一些内容即可确认推测列表的其他部分:
Poly / ML支持自5.2版本(2006年起)的本机线程(POSIX线程或Windows线程)。当前Poly / ML 5.5(2012年夏季)改进了对并行内存管理的支持:一些GC阶段使用多个线程,特别支持在线共享不可变值以减少大型应用程序的内存占用。
Isabelle / ML为Poly / ML线程提供了一个附加的未来库。 Isabelle是一个交互式定理证明器,但它与基于Poly / ML的增强版SML集成。
答案 7 :(得分:0)
python不是一种特别功能的语言,并且使用GIL,它也不是很平行,但是与multiprocessing模块(自2.6以来的标准)相结合,你得到了两者,但它并不像纯函数式语言。
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]"