编辑:好的,这是一个更简单的例子来说明我的问题。为什么只有第一个任务被放入队列?
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();
pool.put(task!simpleWorker(0,5,pool));
pool.finish(true);
writeln("Done");
}
原来的:
我需要遍历这个 DAG。当我访问一个节点时,我会清理它。在所有父节点都干净之前,我无法清理节点。
我正在尝试的方法是让工作线程的当前节点检查其所有子节点以查看哪些子节点可以处理。任何可以处理的都添加到任务池中。
我的问题是我不知道如何将新任务添加到 TaskPool 并处理它们。这只是清理 DAG 中的第一个节点,然后退出,让其他一切都变脏。
void cleanNode(Node node, TaskPool pool){
node.doProcess();
foreach (client; node.clients){
if (client.canProcess()){
pool.put(task!cleanNode(client, pool));
}
}
}
void main(){
auto dag = mkTestDag(5);
auto pool = new TaskPool();
pool.put( task!cleanNode(dag[0], pool));
pool.finish(true);
writeln("\n\nOutput:");
foreach (d;dag){
writeln(d);
writeln(d.dirty ? "dirty" : "clean","\n");
}
}
完整代码在这里: http: //pastebin.com/LLfMyKVp