On Sun, Oct 14, 2012 at 3:55 PM, Ben Darnell email@example.com wrote:
Ah, OK. I was mistaken about the "first yield" part, but the rest stands. The problem is that as soon as task1 blocks on IO, the entire current task (which includes outer(), par(), and both children) gets unscheduled. no part of task2 gets scheduled until it gets yielded from, because the scheduler can't see it until then.
Ah, yes. I had forgotten that the whole stack (at least all frames currently blocked in yield-from) is suspended.
I really hope that Greg has a working implementation of par().
The good and bad parts of this proposal both stem from the fact that yield from is very similar to just inlining everything together. This gives you the exception handling semantics that you expect from synchronous code, but it means that the scheduler can't distinguish between subtasks; you have to explicitly schedule them as top-level tasks.
I'm beginning to see that. Thanks for helping me form my intuition about how this stuff works!