Erlang风格的并发在D编程语言中

我认为Erlang式并发是核数量指数增长的答案。你可以伪造它与其他主流语言。但解决方案总是让我想要。我不愿意放弃多范式编程(C / D)来切换到Erlang的严格语法。

什么是Erlang式并发:

从一个语言作者(What is Erlang’s concurrency model actually ?):

>轻量级并发。
廉价创建线程和廉价保持疯狂的数字。
>异步通信。
线程仅通过消息进行通信。
>错误处理。
>过程隔离。

或来自知情的博主(What is Erlang-Style Concurrency?):

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

我认为D’s message passing可以完成这些功能的大部分。我想知道的是“>> 10,000个并发进程(线程)”和“快速进程创建/销毁”。

D如何处理这些要求?

我认为,为了正确支持他们必须使用green threads.可以D的消息传递功能与绿色线程库一起使用?

最佳答案
默认情况下,存储在D中是线程本地的,因此线程之间没有共享,除非它被特别标记为共享。如果将变量标记为共享,那么可以使用传统的互斥体和条件以及同步对象等来处理并发。但是,线程之间通信的首选方法是在std.concurrency中使用消息传递设施,并让所有数据保持线程本地化,只有在必须使用共享时。使用std.concurrency在线程之间传递的所有对象必须通过值传递或不可变,所以不会发生共享,并且它是完全线程安全的。但是,获取不是一个数组的不可变引用类型(idup通常使数组容易使用),现在可能有点痛苦,所以它可能有点恼人,传递除值类型或数组之外的任何东西虽然希望情况改善很快,因为编译器和标准库bug与const和immutable相关获得固定和更多的代码使得const正确)。

现在,虽然在D中的消息传递肯定会导致更清洁,更安全的代码,比你在语言如C或Java,它是建立在正常的C线程(如Linux使用pthreads)之上,所以它没有Erlang所使用的轻量级线程的类型,所以处理多个线程不会像Erlang一样高效。

当然,我没有看到任何理由为什么一个更高效的线程系统不能使用D编写,在这一点你可能能够得到类似于Erlang的线程效率,它可以推测使用类似于的std.concurrency,但所有的D的标准线程的东西是建立在正常的C线程的顶部,所以你必须自己做所有这些,而且取决于你如何实现它,并取决于如何确切的线程局部/共享的东西由编译器和运行时处理,可能很难得到类型系统强制执行所有的线程本地与你的“绿色”线程。恐怕我不知道确切的共享如何实现或如何“绿色”线程工作知道肯定。

无论如何,D的消息传递系统肯定会导致处理线程比C或甚至Java更愉快,但它的设计不是像Erlang一样精简。 D是一种通用系统语言,而不是一种特别设计为使用线程用于一切的语言,因此尽可能高效地使用它们。 D的标准设施的大部分建立在C之上,因此它的许多效率特性将类似于C.

转载注明原文:Erlang风格的并发在D编程语言中 - 代码日志