相关API文档:标准并行度 http://dlang.org/phobos/std_parallelism.html
以下是完成示例的几种方法:
并行 foreach,使用任务池parallel http://dlang.org/phobos/std_parallelism.html#.TaskPool.parallel:
foreach (i, val; taskPool.parallel(new int[50])) {
writeln("Hello:", i);
}
常规 foreach,使用以下命令将任务添加到任务池中put http://dlang.org/phobos/std_parallelism.html#.TaskPool.put:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
taskPool.put(t);
}
执行每个任务新线程 http://dlang.org/phobos/std_parallelism.html#.task而不是任务池:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
t.executeInNewThread();
}
Rust 的运行时有一个内置的任务调度程序,但对于 D,这是作为一个库实现的。话虽这么说,第二个在功能方面最接近,最后一个在语法方面最接近(但它们是操作系统线程,而不是轻量级)。
在 D 中,轻量级线程由程序员显式控制。 ATaskPool
类似于 Rust/Go 中的调度程序,但它为程序员提供了更细粒度的控制。这使得它稍微更冗长,但它也为您提供了并行版本map
, reduce
, foreach
等等。这使得更容易有效地表示更复杂的算法。
运行每个示例应该会给出预期结果:乱序写入。
Note:
来自文档:
该池中的工作线程是守护线程,这意味着在终止主线程之前无需调用 TaskPool.stop 或 TaskPool.finish。
第二个示例不会等到所有工作人员完成,因此在测试中您可能不会得到任何结果(当 main 完成时,所有剩余任务都将被终止)。您可能需要通过拨打电话来阻止finish http://dlang.org/phobos/std_parallelism.html#.TaskPool.finish:
taskPool.finish(true);