Это упрощение и сужение к другому из моих вопросов: Нужна помощь в параллельном обходе даг в D
Скажем, у вас есть код, который вы хотите распараллелить. Проблема в том, что некоторые из вещей, которые вам нужно сделать, имеют предварительные условия. Поэтому вы должны убедиться, что эти предварительные условия выполнены, прежде чем добавлять новую задачу в пул. Простой концептуальный ответ состоит в том, чтобы добавлять новые задачи по мере выполнения их предварительных требований.
Здесь у меня есть небольшой фрагмент кода, который эмулирует этот шаблон. Проблема в том, что он генерирует исключение, потому что pool.finish()
вызывается до того, как новая задача будет помещена в очередь рабочим потоком. Есть ли способ просто подождать, пока все потоки не будут простаивать или что-то в этом роде? Или есть другая конструкция, которая позволила бы использовать этот шаблон?
Обратите внимание: это упрощенная версия моего кода для иллюстрации проблемы. Я не могу просто использовать taskPool.parallel()
в foreach.
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");
}
}
t.workForce()
перед вызовомpool.finish()
в главном - person ratchet freak   schedule 25.10.2013