D中是否有相当于goroutines?

时间:2011-12-07 07:58:55

标签: concurrency go d coroutine

我喜欢Go,特别是goroutines。它们简单而有效。经过一番挖掘后,似乎它们基本上都是光纤复用到内核线程池中(如果我错了,请纠正我)。

话虽如此,D中是否有标准库(或相对受欢迎且支持的第三方添加)?

我想要的主要内容是:

  • 轻量级线程使用太多内存并占用太多CPU
  • 简单数据共享不是太重要,但简单的消息传递是
  • 管理 - 这对于处于运行时级别来说会很好

这里的主要目标是使Web服务器尽可能高效地与Node.js和Go的速度相媲美。这意味着可能有许多活动连接(http,websockets,数据流)。

我喜欢上面提到的其他平台,但D更加普遍。如果它不太笨重,我会选择D而不是其他。

3 个答案:

答案 0 :(得分:4)

没有什么完全等效,但有两个模块可以提供足够类似的东西满足您的需求:

  1. std.concurrency提供消息传递和保证隔离,除非shared限定符用于获取非常有限的显式共享内存。但是,您(还)没有将光纤多路复用到goroutines提供的线程上。现在,每次调用spawn都会启动一个新的OS线程。此外,还有一些工作要做,以使不变性足以使这种范式充分发挥其潜力。有关此范例的更多信息,请参阅Andrei Alexandrescu's "The D Programming Language".

  2. 的免费章节
  3. std.parallelism提供任务。它面向并行性,而不是并发性。 (These are not the same thing even though you need concurrency to implement parallelism.)因此,任务只是在没有与调用线程通信的情况下执行,而是将其返回值返回给调用线程,而不是消息传递。此外,如果任务多于线程,则多余的任务将排队,而不是使用光纤进行多路复用。

  4. 编辑:我最初设计并编写了std.parallelism,我愿意考虑增强请求以满足您的需求,只要它们不会将模块的范围扩展到一般情况并发。如果std.parallelism几乎完成你所需要的但不完全,请在这里或在digitalmars.d新闻组上发布功能请求。

    此外,即使我可能不是这种请求的实现者,也可以建议对std.concurrency进行增强。

答案 1 :(得分:2)

std.parallel使用线程池来运行任务,但是你需要实现自己的消息传递例程(目前库AFAIK中没有可用的线程安全队列)

答案 2 :(得分:0)

我不知道D库是否可以提供拆分堆栈支持(线程/光纤)。如果没有它,遗憾的是很多Go goroutines的用处都会丢失。

如果使用goroutines解决一些问题很容易/更好,那么为什么不首先使用Go?