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