这是对我的另一个问题的简化和缩小:Need help parallel traversing a dag in D
假设您有一些要并行化的代码。问题是,您需要做的一些事情有先决条件。因此,在将新任务添加到池中之前,必须确保已完成这些先决条件。简单的概念性答案是在完成先决条件时添加新任务。
这里我有一小段代码可以模仿这种模式。问题是,它抛出一个异常,因为在工作线程将新任务放入队列之前调用pool.finish()
。有没有办法等待'直到所有线程闲置或什么?或者是否有另一种允许这种模式的构造?
请注意:这是我的代码的简化版本,用于说明问题。我不能在foreach中使用taskPool.parallel()
。
import std.stdio;
import std.parallelism;
void simpleWorker(uint depth, uint maxDepth, TaskPool pool){
writeln("Depth is: ",depth);
if (++depth < maxDepth){
pool.put( task!simpleWorker(depth,maxDepth,pool));
}
}
void main(){
auto pool = new TaskPool();
auto t = task!simpleWorker(0,5,pool);
pool.put(t);
pool.finish(true);
if (t.done()){ //rethrows the exception thrown by the thread.
writeln("Done");
}
}
答案 0 :(得分:1)
我修好了它:http://dpaste.dzfl.pl/eb9e4cfc
我改为for循环:
void cleanNodeSimple(Node node, TaskPool pool){
node.doProcess();
foreach (cli; pool.parallel(node.clients,1)){ // using parallel to make it concurrent
if (cli.canProcess()) {
cleanNodeSimple(cli, pool);
// no explicit task creation (already handled by parallel)
}
}
}