其他语言的 Erlang 风格并发

Posted

技术标签:

【中文标题】其他语言的 Erlang 风格并发【英文标题】:Erlang-style Concurrency for Other Languages 【发布时间】:2010-09-06 12:52:42 【问题描述】:

其他编程语言有哪些库可以提供 Erlang 风格的并发模型(进程、邮箱、模式匹配接收等)?

注意:我对旨在类似于 Erlang 的东西特别感兴趣,而不仅仅是任何线程或队列库。

【问题讨论】:

这里的主要困难在于,虽然您可以使用其他语言进行消息传递,但要模仿 Erlang 对大量进程的使用是极其困难的。在 Erlang 中生成进程类似于在 Java 或 Python 中实例化对象——您不必考虑它。如果您在操作系统级别执行此操作,您将很快耗尽资源,这意味着它不仅是消息传递,而且还必须在架构中进行池化。在这方面,Erlang 的 VM 有点难以遵循。当然,并不是每个问题都需要数百万个并发进程。 【参考方案1】:

Akka (http://akka.io) 深受 erlangs OTP 的影响。它建立在 scala 的 actor 之上,非常适合 JVM 上的并发。

【讨论】:

【参考方案2】:

JoCaml 使用连接演算扩展了 OCaml,用于并发和分布式编程。

【讨论】:

【参考方案3】:

微软对 Erlang 的非生产就绪回答:Microsoft Axum

【讨论】:

【参考方案4】:

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

Revactor 是 Ruby 1.9 的 Actor 模型实现,构建在 Rev 高性能事件库之上。 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 VM 之上的类似 ruby​​ 的脚本语言。 Reia 是 Revactor 的创造者 Tony Arcieri 的新项目。

【讨论】:

【参考方案5】:

警告:无耻插件!

我为这种在 Haskell 中传递的消息开发了一个库: Erlang-style Distributed Haskell.

沃尔克

【讨论】:

【参考方案6】:

Termite 用于 Gambit Scheme。

【讨论】:

【参考方案7】:

Ulf Wiger 最近有一篇关于此主题的精彩帖子 - 以下是他定义的属性,您可以将其称为“Erlang 样式并发”:

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

上面的第 2 项是最难支持的 VM 和最初不是为并发设计的语言实现。这并不是要打击其他语言中的 Erlang 式并发实现,但 Erlang 的很多价值来自于能够创建 数百万 个进程,如果进程抽象具有 1- 1 与操作系统级线程或进程的关系。 Ulf 在上面的链接中有更多关于这方面的内容。

【讨论】:

【参考方案8】:

Mike Rettig 创建了一个名为 Retlang 的 .NET 库和一个名为 Jetlang 的 Java 端口,其灵感来自 Erlang 的并发模型。

【讨论】:

【参考方案9】:

对于python,您可以尝试使用processing module。

【讨论】:

【参考方案10】:

消息传递接口 (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;

当然,两者各有利弊,但事实证明,前者在学术界和其他重型科学计算应用程序中非常成功。 YMMV。

【讨论】:

【参考方案11】:

另外,kilim 是一个 Java 库,它为 Java 语言带来了 erlang 风格的消息传递/actors。

【讨论】:

【参考方案12】:

Scala 支持演员。但我不会故意称 scala 与 Erlang 相似。

不过 scala 绝对值得一看!

【讨论】:

【参考方案13】:

Microsoft Concurrency and Coordination Runtime 用于 .NET。

CCR 适用于 分离的应用模型 组件成碎片,可以 仅通过消息进行交互。 此模型中的组件需要手段 消息之间的协调,处理 复杂的故障场景,以及 有效处理异步 编程。

【讨论】:

以上是关于其他语言的 Erlang 风格并发的主要内容,如果未能解决你的问题,请参考以下文章

回顾Erlang简要

1.Erlang/OTP平台

Hamler:基于Erlang与Haskell的编程语言

Linux 系统安装 Erlang 环境

Erlang 语言中的进程与并发

Erlang编程语言详细介绍: