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

Concurrency D编程语言中的Erlang风格并发,concurrency,erlang,d,Concurrency,Erlang,D,我认为Erlang风格的并发是内核数量指数增长的答案。你可以用其他主流语言来伪装它。但解决方案总是让我不满意。我不愿意放弃多范式编程(C++/D),转而使用Erlang的严格语法 什么是Erlang风格的并发: 来自语言作者之一(): 轻量级并发。 创建线程便宜,维护疯狂数字便宜 异步通信。 线程仅通过消息进行通信 错误处理 进程隔离 或者从一个消息灵通的博主那里(): 快速创建/销毁进程 能够支持>>10000个基本不变的并发进程 快速异步消息传递 复制消息传递语义(不共享任何并发) 过

我认为Erlang风格的并发是内核数量指数增长的答案。你可以用其他主流语言来伪装它。但解决方案总是让我不满意。我不愿意放弃多范式编程(C++/D),转而使用Erlang的严格语法

什么是Erlang风格的并发:

来自语言作者之一():

  • 轻量级并发。
    创建线程便宜,维护疯狂数字便宜
  • 异步通信。
    线程仅通过消息进行通信
  • 错误处理
  • 进程隔离
或者从一个消息灵通的博主那里():

  • 快速创建/销毁进程
  • 能够支持>>10000个基本不变的并发进程
  • 快速异步消息传递
  • 复制消息传递语义(不共享任何并发)
  • 过程监测
  • 选择性信息接收
我认为我们可以实现这些特性中的大部分。我想知道的是“>>10000个并发进程(线程)”和“快速进程创建/销毁”

D如何处理这些要求


我认为要正确地支持它们,您必须使用。D的消息传递功能可以与green threads library一起使用吗?

我对D所知甚少:它的消息传递基础设施构建在它的线程设施之上。如果核心线程库是OS线程上的包装器,那么D中的并发性几乎不可能达到Erlang的量级(>>10000)。此外,D不会对对象强制执行不变性,因此很容易把事情搞砸。因此,Erlang是高并发性的最佳选择。也许您可以用Erlang编写并发性的东西,用D编写项目的其余部分。不过,在类似C的语言(C++、D等)中有高效的绿色线程是可能的——请看一看和。您可以使用这些工具实现非常高效的消息传递框架,并通过C shim或调用它们。

存储在D中默认为线程本地,因此线程之间不会共享任何内容,除非它被特别标记为
共享
。如果将变量标记为共享,则可以使用传统的互斥锁和条件以及同步对象等来处理并发性。然而,线程间通信的首选方法是在std.concurrency中使用消息传递工具,并让所有数据保持线程本地,只有在必须时才使用
共享
。使用std.concurrency在线程之间传递的所有对象必须是按值传递的,或者是不可变的,因此在那里不会发生共享,并且是完全线程安全的。但是,当前获取非数组的不可变引用类型可能有点麻烦(
idup
通常使数组更容易),因此传递值类型或数组以外的任何内容可能有点烦人(尽管希望随着与常量和不可变相关的编译器和标准库bug得到修复,更多的代码得到纠正,这种情况会尽快得到改善)

现在,虽然D中的消息传递将导致比C++或java语言中更为干净、更安全的代码,但它是建立在普通的C线程之上的(例如Linux使用pType),因此它没有Erlang那样的轻量级线程,因此处理多个线程的效率也不如Erlang

当然,我不明白为什么不能用D编写一个更高效的线程系统,在这一点上,您可能可以获得类似于Erlang的线程效率,并且它可能会使用类似于std.concurrency的API,但D的所有标准线程都是在普通的C线程之上构建的,所以您必须要自己完成这一切,并且取决于您如何实现它,取决于编译器和druntime如何准确地处理线程本地/
共享
内容,可能很难让类型系统使用“绿色”强制所有内容都是线程本地的我担心我对
shared
是如何实现的或者“绿色”线程是如何工作的还不太清楚


无论如何,D的消息传递系统肯定会导致线程比C++或java更令人愉快,但它并不是设计成与Erlang一样的流线型。D是通用系统语言,而不是专门用来为所有线程使用线程的语言,因此绝对地使用它们作为EFF。尽可能地简单。D的大部分标准设施都构建在C之上,因此它的许多效率特性将类似于C。

此功能经常与异步I/O结合使用,以有效地与外部数据源进行通信。该框架似乎提供了许多fib和ers-on-a-now-OS-threads线程模型和异步I/O库(以及一整套web应用程序库和项目管理工具)

作为一个不相关的补充说明,D的低级别足以让你在其中编写这个框架,而高级别足以让你在框架之上编写web应用程序,这一点非常酷。其他具有类似框架的流行语言(node.js、Ruby的EventMachine、Python中的coroutines和Go)在低级系统编码方面无法与D竞争。具有类似系统编程功能的其他流行语言(C、C++)在高级应用程序编码方面无法与D竞争


我不熟悉D,但我得说,我喜欢我看到的东西。

你可以用
不可变的
修饰符使一个对象(deep)在D中不可变。这不是默认值。@KennyTM是的,这就是为什么我说“D不在对象上强制不可变…”@Vijay:是的,所以?Y