[Stackless] Implementing CSP
Tom Locke
tom at livelogix.com
Thu Jan 8 08:54:03 CET 2004
> > p.s. My Stackless install crashes whenever a tasklet raises an
> > expcetion. I haven't looked into it further yet - whether catching
the
> > exception will prevent the crash. Is this a known problem? Something
I'm
> > doing wrong?
>
> Hmm...
[SNIP]
> No, can't reproduce this error.
Turns out it was related to my par function, here's my efforts to
isolate the bug:
1. scheduling via channel.receive()
>>> stackless.tasklet(lambda: 1/0)()
<stackless.tasklet object at 0x008F9698>
>>> stackless.channel().receive()
BANG!
Whereas this is fine:
>>> stackless.tasklet(lambda: 1/0)()
<stackless.tasklet object at 0x00862500>
>>> stackless.schedule()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 1, in <lambda>
ZeroDivisionError: integer division or modulo by zero
>>> stackless.channel().receive()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
RuntimeError: the last runnable tasklet cannot be blocked.
Seems to be something to do with the exception causing another stackless
exception (e.g. "can't block the last tasklet")???
I have tried to fix my par function like this:
-----------------
def par(*funcs):
taskEnd = stackless.channel()
def signalEnd(f):
f()
taskEnd.send(1)
for f in funcs:
stackless.tasklet(signalEnd)(f)
stackless.schedule()
count = len(funcs)
while count > 0:
taskEnd.receive()
count -= 1
-----------------
But it still crashes if one of the funcs raises an exception.
I have found one way to fix it - create the taskEnd channel outside the
function (as a global). Then it works fine, but of course the semantics
are messed up if there is more than one par in a program.
I have tried *lots* of different workarounds, but haven't got there yet.
Tom.
_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://www.stackless.com/mailman/listinfo/stackless
More information about the Stackless
mailing list