Sul*_*man 6 multithreading d rust
我知道Rust可以使用轻量级线程运行循环.就像是:
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在D?
bea*_*mit 11
相关的API doc:std.parallelism
以下是完成示例的几种方法:
并行foreach,使用TaskPool的并行:
foreach (i, val; taskPool.parallel(new int[50])) {
writeln("Hello:", i);
}
Run Code Online (Sandbox Code Playgroud)
定期foreach,使用put将任务添加到任务池:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
taskPool.put(t);
}
Run Code Online (Sandbox Code Playgroud)
在新线程中执行每个任务而不是TaskPool:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
t.executeInNewThread();
}
Run Code Online (Sandbox Code Playgroud)
Rust的运行时有一个内置的任务调度程序,但是使用D,它实现为一个库.话虽这么说,第二个是功能最接近的,最后一个是最接近的语法(但它们是OS线程,而不是轻量级).
在D中,轻量级线程由程序员明确控制.A TaskPool类似于Rust/Go中的调度程序,但它为程序员提供了更细粒度的控制.这使得它稍微详细,但它也给你的并行版本map,reduce,foreach等,这使得它更容易有效地表示更复杂的算法.
运行每个示例应该会给出预期的结果:乱序写入.
注意:
来自doc:
此池中的工作线程是守护程序线程,这意味着在终止主线程之前不必调用TaskPool.stop或TaskPool.finish.
第二个例子不等到所有工人都完成,所以在测试中你可能没有结果(当主要完成时,所有剩余的任务都被杀死).您可能需要通过调用finish来阻止:
taskPool.finish(true);
Run Code Online (Sandbox Code Playgroud)
D没有针对轻量级线程的内置抽象.相反,你可以:
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |