我知道Rust可以使用轻量级线程运行循环。类似的东西:
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
我怎么能在D中做到这一点?
答案 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中的调度程序,但它为程序员提供了更细粒度的控制。这使得它更加冗长,但它也为您提供map
,reduce
,foreach
等的并行版本。这样可以更轻松地有效地表示更复杂的算法。
运行每个示例应该会给出预期的结果:乱序写入。
注意:强>
来自doc:
此池中的工作线程是守护程序线程,这意味着在终止主线程之前不必调用TaskPool.stop或TaskPool.finish。
第二个例子不等到所有工人都完成,所以在测试中你可能没有结果(当主要完成时,所有剩余的任务都被杀死)。您可能需要致电finish:
来阻止taskPool.finish(true);
答案 1 :(得分:8)
D没有针对轻量级线程的内置抽象。相反,你可以: