It is because an Error is being thrown from the put inside simpleWorker.
This version shows the error:
import std.stdio;
import std.parallelism;
void simpleWorker(uint depth, uint maxDepth, TaskPool pool){
writeln("Depth is: ",depth);
if (++depth < maxDepth){
try {
pool.put( task!simpleWorker(depth,maxDepth,pool));
} catch (Error e) {
writeln("Fail: ", e.msg);
}
}
}
void main(){
auto pool = new TaskPool();
pool.put(task!simpleWorker(0,5,pool));
pool.finish(true);
writeln("Done");
}
And the output:
Depth is: 0
Fail: Cannot submit a new task to a pool after calling finish() or stop().
Done
Hopefully someone else can explain the correct way to use TaskPool.
Edit
Got it working by telling the tasks to run like this:
import std.stdio;
import std.parallelism;
void simpleWorker(uint depth, uint maxDepth, TaskPool pool){
writeln("Depth is: ",depth);
if (++depth < maxDepth){
try
{
auto subWorker = task!simpleWorker(depth,maxDepth, pool);
pool.put(subWorker);
subWorker.yieldForce();
} catch (Error t) {
writeln("Fail: (", typeof(t).stringof, ") ", t.msg);
}
}
}
void main(){
auto pool = new TaskPool();
auto worker = task!simpleWorker(0,5, pool);
pool.put(worker);
worker.yieldForce();
pool.finish(true);
writeln("Done");
}
Output:
Depth is: 0
Depth is: 1
Depth is: 2
Depth is: 3
Depth is: 4
Done