D中的多线程与for循环

时间:2013-03-09 09:14:55

标签: multithreading d rust

我知道Rust可以使用轻量级线程运行循环。类似的东西:

use task::spawn;

fn main() {
  for 100.times {
    do spawn {
      io::println("Hello");
    }
  }

我怎么能在D中做到这一点?

2 个答案:

答案 0 :(得分:11)

相关API文档:std.parallelism

以下是完成示例的几种方法:

并行foreach,使用TaskPool的parallel

foreach (i, val; taskPool.parallel(new int[50])) {
    writeln("Hello:", i);
}

定期foreach,使用put向任务池添加任务:

foreach (i; 0 .. 50) {
    auto t = task!writeln("Hello:", i);
    taskPool.put(t);
}

执行new thread而不是TaskPool中的每项任务:

foreach (i; 0 .. 50) {
    auto t = task!writeln("Hello:", i);
    t.executeInNewThread();
}

Rust的运行时有一个内置的任务调度程序,但是使用D,它实现为一个库。话虽如此,第二个是功能最接近的,最后一个是最接近的语法(但它们是操作系统线程,而不是轻量级)。

在D中,轻量级线程由程序员明确控制。 TaskPool类似于Rust / Go中的调度程序,但它为程序员提供了更细粒度的控制。这使得它更加冗长,但它也为您提供mapreduceforeach等的并行版本。这样可以更轻松地有效地表示更复杂的算法。

运行每个示例应该会给出预期的结果:乱序写入。

注意:

来自doc:

  

此池中的工作线程是守护程序线程,这意味着在终止主线程之前不必调用TaskPool.stop或TaskPool.finish。

第二个例子不等到所有工人都完成,所以在测试中你可能没有结果(当主要完成时,所有剩余的任务都被杀死)。您可能需要致电finish

来阻止
taskPool.finish(true);

答案 1 :(得分:8)

D没有针对轻量级线程的内置抽象。相反,你可以:

  • 使用主题(请参阅std.concurrencystd.parallelism
  • 使用fibers,并通过显式生成执行手动执行多任务
  • 使用Vibe.d等库,它使用光纤实现异步I / O,并在阻塞操作时隐式产生