【问题标题】:Is there an equivalent of goroutines in D?D中是否有等价的goroutines?
【发布时间】:2012-01-14 18:31:33
【问题描述】:

我喜欢 Go,尤其是 goroutine。它们简单而高效。经过一番挖掘,似乎它们基本上是多路复用到内核线程池上的光纤(如果我错了,请纠正我)。

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

我想要的主要是:

  • 轻量级线程使用过多内存并占用过多 CPU
  • 简单的数据共享不太重要,但简单的消息传递很重要
  • 托管 - 最好是在运行时级别

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

我喜欢提到的其他平台,但 D 更通用。如果不是太笨重,我会选择 D 而不是其他。

【问题讨论】:

  • 最好是 Linux 或 BSD。
  • 嗯...无论如何,您可能有兴趣阅读有关 Windows 7 x64(和 Windows 8)的新 User Mode Scheduler,尽管我认为它不会太有用,因为您正在寻找 BSD/Linux。

标签: concurrency go d coroutine


【解决方案1】:

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

  1. std.concurrency 提供消息传递和保证隔离,除非shared 限定符用于获得非常有限的显式共享内存。但是,您(还)没有将光纤多路复用到 goroutine 提供的线程上。现在,每次调用spawn 都会启动一个新的操作系统线程。此外,还有一些工作要做,以使不变性足够可用,以使这种范式充分发挥其潜力。有关此范例的更多信息,请参阅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.) 因此,任务不是传递消息,而是简单地执行而不与调用线程通信,然后将其返回值返回给调用线程。此外,如果任务多于线程,则多余的任务会排队,而不是使用光纤进行多路复用。

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

此外,尽管我可能不是此类请求的实施者,但请随时建议对 std.concurrency 的增强。

【讨论】:

  • 我认为 std.parallelism 应该可以工作。我需要编写一些代码,看看它是否真的很合适。我假设安全和可信的函数是完全线程安全的。
  • @tjameson:是的,std.parallelism 的安全可信功能使用与 std.concurrency 相同的机制来提供隔离保证。
【解决方案2】:

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

【讨论】:

  • 看起来很有趣。对于我的特定用例(Web 服务器),每个连接都可以添加到任务池中,这应该模拟 goroutines?
  • @tjameson 如果任务和主线程之间不需要进一步的通信,它应该
【解决方案3】:

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

如果使用 goroutines 可以轻松/更好地解决某些问题,那么为什么不首先使用 Go 呢?

【讨论】:

  • 不错。不幸的是,查看d.digitalmars.com/2.0/phobos/std_thread.html 似乎没有可用的拆分堆栈支持。
  • 如果可以得到与 Go 相同的结果(类似的性能),我会在这两种情况下都使用 D。如果没有,我会使用 Go。
  • @ratchetfreak - Fiber 类是否像 std.parallelism 中的 Task 一样在线程池中运行?
  • 不,它与调用 call() 的线程在同一线程中运行,它硬连线上下文切换 see the source
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2011-05-29
  • 2014-01-04
  • 2016-06-08
相关资源
最近更新 更多