2008-08-22 31 views
19

其他编程语言提供了哪些库来提供Erlang风格的并发模型(进程,邮箱,模式匹配接收等)?其他语言的Erlang风格的并发性

注:我特别感兴趣的是与Erlang类似的东西,而不仅仅是任何线程库或排队库。

+0

这里的主要困难是,尽管你可以用其他语言传递消息,但是模仿Erlang使用大量进程是非常困难的。 Erlang中的产卵过程类似于在Java或Python中实例化对象 - 您不需要考虑。如果您在操作系统级别执行此操作,您将很快耗尽资源,这意味着它不仅仅是消息传递,而且还必须将其合并到架构中。在这方面,Erlang的虚拟机有点难以遵循。当然,并非每个问题都需要数百万个并发进程。 – zxq9 2014-10-01 10:52:56

回答

7

消息传递接口(MPI)(http://www-unix.mcs.anl.gov/mpi/)是一个用于并行编程的高度可扩展和强大的库,面向C的原始版本,但现在可用于几种版本http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations。虽然这个库没有引入新的语法,但它提供了一种通信协议来协调可并行化的例程之间的数据共享。

传统上,它被用于大型集群计算而不是单一系统的并发,尽管多核系统当然可以利用这个库。

并行编程问题的另一个有趣的解决方案是OpenMP,它试图在各种平台上提供可移植扩展,以向编译器提供关于哪些代码段容易并行化的提示。

例如(http://en.wikipedia.org/wiki/OpenMP#Work-sharing_constructs):

#define N 100000 
int main(int argc, char *argv[]) 
{ 
    int i, a[N]; 
    #pragma omp parallel for 
    for (i=0;i<N;i++) 
    a[i]= 2*i; 
    return 0; 
} 

有优点和缺点这两个,当然,但前者已被证明是在学术界和其他重型科学计算的应用非常成功。因人而异。

6

Microsoft的Concurrency and Coordination Runtime for .NET。

的CCR是适合于该 部件分离成片,可以 仅通过消息交互的应用程序 模型。 这个模型中的组件需要手段 消息之间的协调,处理 复杂的故障情况,和 有效地处理异步 编程。

7

斯卡拉支持演员。但我不会打算scala故意类似于Erlang。

尽管如此scala绝对值得一看!

6

另外kilim是一个java库,它将erlang风格的消息传递/参与者引入Java语言。

5

Mike Rettig创建了一个名为Retlang的.NET库和一个名为Jetlang的Java端口,它受Erlang并发模型的启发。

14

Ulf Wiger有一个伟大的职位最近关于这个主题 - 在这里是因为需要才可以调用的东西“二郎风格并发”,他定义的属性:

  • 快速进程创建/销毁
  • 能够支持>> 10 000个并发进程,特性基本不变。
  • 快速异步消息传递。
  • 复制消息传递语义(无共享并发)。
  • 过程监控。
  • 选择性讯息接收。

上面的第2个数字最难支持最初并未设计为并发的VM和语言实现。这并不是要在其他语言中推敲Erlang-ish并发实现,但是很多Erlang的价值来自于能够创建进程的百万,如果进程抽象与OS具有1-1关系,这非常困难级别的线程或进程。在上面的链接中,Ulf有很多这方面的内容。

3

如果您在使用Ruby,看看Revactor的:http://revactor.org/][1]

Revactor的是Ruby 1.9的Actor模型的实现建立在启高性能事件库的顶部。 Revactor主要用于编写类似Erlang的网络服务和工具。

看看这个代码示例:

myactor = Actor.spawn do 
    Actor.receive do |filter| 
     filter.when(:dog) { puts "I got a dog!" } 
    end 
    end 

Revactor的只能运行在Ruby 1.9的。我相信图书馆的作者已经停止了维护,但他们网站上的文档非常好。

您可能还想看看Reia:一种构建在Erlang虚拟机之上的ruby式脚本语言。 Reia是Revactor创造者的新项目:Tony Arcieri。

2

JoCaml OCaml的延伸与加盟结石并发和分布式编程。

1

Akka(http://akka.io)受Erlangs OTP严重影响。它建立在scala的角色之上,并且非常适合JVM上的并发。