D语言中是否有类似于goroutines的东西?

6

我喜欢Go,特别是它的goroutines。它们简单而高效。经过一些挖掘,似乎它们基本上是纤程(fibers)多路复用到一个内核线程池中(如果我说错了请纠正)。

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

我想要的主要是:

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

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

我喜欢其他平台的一些东西,但D更加通用。如果不太笨重,我会选择D而不是其他语言。


最好使用Linux或BSD。 - beatgammit
无论如何,您可能会对阅读有关Windows 7 x64(和Windows 8)的新用户模式调度程序感兴趣,尽管我不认为它对您寻找BSD / Linux有太大用处。 - user541686
3个回答

4

虽然没有完全相同的东西,但有两个模块可能提供足够类似的功能:

  1. std.concurrency 提供消息传递和保证隔离,除非使用 shared 限定符获得非常有限的显式共享内存。然而,您目前还没有像 goroutines 那样将纤程复用到线程上。现在,每次对 spawn 的调用都会启动一个新的操作系统线程。此外,仍然需要一些工作来使不变性足够可用,以使这种范式发挥其全部潜力。有关此范式的更多信息,请参见Andrei Alexandrescu的"The D Programming Language"免费章节

  2. std.parallelism 提供任务。它面向并行性,而不是并发性。(尽管实现并行性需要并发性,但这两者不是同一回事。)因此,与消息传递不同,任务只需执行,无需与调用线程进行通信,然后将其返回值返回给调用线程。此外,如果存在超过线程数的任务,则多余的任务将排队,而不是使用纤程进行多路复用。

编辑:我最初设计并编写了std.parallelism,并愿意考虑增强请求以满足您的需求,只要它们不将模块范围扩展到一般情况并发性。如果std.parallelism几乎可以满足您的需求,但还有些不足,请在此处或digitalmars.d新闻组中发布功能请求。
此外,即使我可能不是这样一个请求的实现者,也可以自由地建议增强std.concurrency。

我认为std.parallelism应该可以工作。我需要编写一些代码来查看它是否真正适合。我假设安全和可信函数完全是线程安全的。 - beatgammit
@tjameson:是的,std.parallelism的安全和可信函数使用与std.concurrency相同的机制来提供隔离保证。 - dsimcha

2

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


看起来很有趣。对于我的特定用例(一个 web 服务器),每个连接都可以添加到任务池中,这应该模拟 goroutines? - beatgammit
如果任务和主线程之间不需要进一步的通信,那么就应该这样做。 - ratchet freak

0

我不知道D语言库是否可以提供分割堆栈支持(给线程/纤程)。如果没有它,很多Go协程的有用性就会失去。

如果某些问题使用协程更容易/更好解决,那为什么不一开始就使用Go呢?


很好。不幸的是,查看http://d.digitalmars.com/2.0/phobos/std_thread.html,似乎没有可用的分割堆栈支持。 - zzzz
如果能够获得与Go相同的结果(类似的性能),我会在两种情况下都使用D。否则,我会使用Go。 - beatgammit
@ratchetfreak - Fiber类是否像std.parallelism中的Task一样在线程池中运行? - beatgammit
它在调用call()的线程中运行,硬编码了上下文切换请参见源代码 - ratchet freak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接