我知道Rust可以使用轻量级线程运行循环。例如:D中的多线程for循环
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
我该如何在D中做到这一点?
我知道Rust可以使用轻量级线程运行循环。例如:D中的多线程for循环
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
我该如何在D中做到这一点?
相关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();
}
锈病的运行时有一个内置的任务调度程序,但d,这是作为一个库。这就是说,第二个是功能方面最接近的,而最后一个在语法方面最接近(但是它们是OS线程,而不是轻量级)。
在D中,轻量级线程由程序员明确控制。 A TaskPool
类似于Rust/Go中的调度程序,但它为程序员提供了更细致的控制。这使得它稍微更加冗长,但它也为您提供了并行版本map
,reduce
,foreach
等。这使得更有效地表示更复杂的算法变得更容易。
运行每个例子都会给你预期的结果:无序写入。
注:
从DOC:
此池中的工作线程是守护线程,这意味着没有必要在终止之前调用TaskPool.stop或TaskPool.finish主线程。
第二个示例不会等到所有工作完成,因此在测试中您可能得不到任何结果(当主完成后,所有剩余的任务将被终止)。您可能需要通过调用finish阻止:
taskPool.finish(true);
d对轻量级线程没有内置的抽象。取而代之的是,可以:
我可以这样做: 对(INT I = 0; I <10; i.parallel){ WRI teln(“处理”,我); } ? – Suliman 2013-03-09 11:41:44
@Suliman - 你有关语法的问题吗?因为这几乎就是前两个所做的(更多的是第二个)。你必须使用taskPool对象,因为D不会为你做。 – tjameson 2013-03-09 11:47:08
是的,关于语法。 – Suliman 2013-03-09 12:37:17