我认为Erlang风格的并发性是核心数量呈指数增长的答案。你可以用其他主流语言伪造它。但解决方案总是让我失望。我不愿意放弃多范式编程(C ++ / D)来切换到Erlang的严苛语法。
什么是Erlang风格的并发:
来自其中一位语言作者(What is Erlang's concurrency model actually ?):
或者来自知情的博主(What is Erlang-Style Concurrency?):
我认为D's message passing可以完成大部分功能。我想知道的是“>> 10,000个并发进程(线程)”和“快速进程创建/销毁”。
D如何处理这些要求?
我认为要正确支持它们,您必须使用green threads。可以将D消息传递功能与绿色线程库一起使用吗?
答案 0 :(得分:19)
默认情况下,存储在D中是线程本地的,因此除非特别标记为shared
,否则线程之间不会共享任何内容。如果将变量标记为shared
,则可以使用传统的互斥锁和条件以及同步对象等来处理并发。但是,线程之间通信的首选方法是使用std.concurrency中的消息传递工具,并让所有数据保持线程本地,只有在必要时才使用shared
。使用std.concurrency在线程之间传递的所有对象必须通过值传递或者是不可变的,因此不会发生共享并且它完全是线程安全的。但是,获取不是数组的不可变引用类型(idup
通常使数组很容易)可能会有点痛苦,因此传递除值之外的任何内容都会有点烦人类型或数组(尽管希望这种情况很快得到改善,因为与const和immutable相关的编译器和标准库错误得到修复,更多的代码变为const-correct)。
现在,虽然在D中传递消息肯定会产生比在C ++或Java等语言中更清晰,更安全的代码,但 构建在普通的C线程之上(例如Linux使用pthreads),因此它没有Erlang所做的那种轻量级线程,因此处理多个线程不会像Erlang那样高效。
当然,我没有看到为什么无法使用D编写更高效的线程系统的任何理由,此时您可能能够获得类似于Erlang的线程效率,并且它可能会使用API类似于std.concurrency,但所有D的标准线程都建立在普通的C线程之上,所以你必须自己完成所有这些,并且取决于你如何实现它并取决于具体如何线程本地/ shared
内容由编译器和druntime处理,可能很难让类型系统强制执行所有内容与您的“绿色”线程一起是线程本地的。我担心我对shared
到底是如何实现的,或者“绿色”线程如何确定无法了解。
无论如何,D的消息传递系统肯定会导致处理线程比C ++甚至Java更令人愉快,但它的设计并不像Erlang那样简化。 D是一种通用系统语言,而不是专门为所有使用线程而设计的语言,因此绝对尽可能高效地使用它们。 D的标准设施很大一部分建立在C之上,因此它的许多效率特性与C类似。
答案 1 :(得分:7)
此功能经常与异步I / O结合使用,以便与外部数据源进行有效通信。 vibe.d框架似乎提供了多个光纤上的少数几个OS线程的线程模型和异步I / O库(除了一大堆Web应用程序库和项目管理工具之外)。
作为一个不相关的附注,D非常低级,以至于你可以在其中编写这个框架并且高级别足以成为一种引人注目的语言来编写Web应用程序在框架之上,这非常令人讨厌。 。具有类似框架的其他流行语言(node.js,Ruby的EventMachine,Python和Go中的协同程序)无法在低级系统编码上与D竞争。其他具有类似系统编程设施(C,C ++)的流行语言无法在高级应用程序编码上竞争。
我是D的新手,但我得说,我喜欢我所看到的。
答案 2 :(得分:4)
从我对D的了解很少:它的消息传递基础设施建立在它的线程设施之上。如果核心线程库是OS线程上的包装器,则D中的并发性几乎不可能达到Erlang的大小(>> 10000)。此外,D不强制对象的不变性,因此很容易弄乱。因此,Erlang是重度并发的最佳选择。可能你可以在Erlang中编写并发内容,在D中编写项目的其余部分。但是,有可能在C语言中使用高效的绿色线程(C ++,D等) - 看看Protothreads和{ {3}}。您可以使用这些框架实现非常高效的消息传递框架,并通过C shim或ZeroMQ调用它们。