2013-03-09 62 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對輕量級線程沒有內置的抽象。取而代之的是,可以: