2013-03-09 65 views
6

我知道Rust可以使用轻量级线程运行循环。例如:D中的多线程for循环

use task::spawn; 

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

我该如何在D中做到这一点?

回答

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(); 
} 

锈病的运行时有一个内置的任务调度程序,但d,这是作为一个库。这就是说,第二个是功能方面最接近的,而最后一个在语法方面最接近(但是它们是OS线程,而不是轻量级)。

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

运行每个例子都会给你预期的结果:无序写入。

注:

从DOC:

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

第二个示例不会等到所有工作完成,因此在测试中您可能得不到任何结果(当主完成后,所有剩余的任务将被终止)。您可能需要通过调用finish阻止:

taskPool.finish(true); 
+0

我可以这样做: 对(INT I = 0; I <10; i.parallel){ WRI teln(“处理”,我); } ? – Suliman 2013-03-09 11:41:44

+0

@Suliman - 你有关语法的问题吗?因为这几乎就是前两个所做的(更多的是第二个)。你必须使用taskPool对象,因为D不会为你做。 – tjameson 2013-03-09 11:47:08

+0

是的,关于语法。 – Suliman 2013-03-09 12:37:17

8

d对轻量级线程没有内置的抽象。取而代之的是,可以: