我知道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