D中的多线程与for循环

Sul*_*man 6 multithreading d rust

我知道Rust可以使用轻量级线程运行循环.就像是:

use task::spawn;

fn main() {
  for 100.times {
    do spawn {
      io::println("Hello");
    }
  }
Run Code Online (Sandbox Code Playgroud)

我怎么能在D?

bea*_*mit 11

相关的API doc:std.parallelism

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

并行foreach,使用TaskPool的并行:

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

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

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

新线程中执行每个任务而不是TaskPool:

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

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

在D中,轻量级线程由程序员明确控制.A TaskPool类似于Rust/Go中的调度程序,但它为程序员提供了更细粒度的控制.这使得它稍微详细,但它也给你的并行版本map,reduce,foreach等,这使得它更容易有效地表示更复杂的算法.

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

注意:

来自doc:

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

第二个例子不等到所有工人都完成,所以在测试中你可能没有结果(当主要完成时,所有剩余的任务都被杀死).您可能需要通过调用finish来阻止:

taskPool.finish(true);
Run Code Online (Sandbox Code Playgroud)


Vla*_*eev 8

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