[Stackless] Retrieving the Return Value of a Stackless Python Tasklet Bound Function?
Kristján Valur Jónsson
kristjan at ccpgames.com
Wed Jun 23 16:15:28 CEST 2010
Even better, you can do this:
def RunFunctionAndGetResult(chan, func, *args, **kwargs):
try:
chan.send(func(*args, **kwargs))
except Exception, e:
import sys
chan.send_exception(*sys.exc_info()[:2])
thus passing exception information onwards. The good thing about using a channel is that the waiting task can choose wheter it blocks for the tasklet, or just polls it. Otherwise, you could use some external structure, such as a list, to do this. The channel will also magically re-raise the exception.
One wart with this is the need to use exc_info. This is because of the arguments that send_exception takes. It would be better (and I will change this) if send_exception could take the same arguments as the "raise" keyword. That way, one could use
chan.send_exception(e) #just send the same exception instance onward
chan.send_exception(*sys.exc_info()) #send full info, including traceback.
K
> -----Original Message-----
> From: stackless-bounces at stackless.com [mailto:stackless-
> bounces at stackless.com] On Behalf Of Richard Tew
> Sent: 22. júní 2010 21:17
> To: The Stackless Python Mailing List
> Subject: Re: [Stackless] Retrieving the Return Value of a Stackless
> Python Tasklet Bound Function?
>
> On Tue, Jun 22, 2010 at 11:37 PM, Lin Luo <luolin at ccpgames.com> wrote:
> > the caller. But I have yet to see a way to retrieve the return value
> of the
> > bound callable running as a tasklet.
>
> I do not know that there is one.
>
> > important return value to be used later. It seems that writing such a
> > Micromanaging function on the C side is not very feasible, since I
> haven't
>
> The simplest way to do this would be to define the wrapping Python
> function code in C as a string, and to compile it into a function
> object that you can run as a tasklet. An example Python function
> follows, the C part I leave to you.
>
> e.g.
>
> def RunFunctionAndGetResult(chan, func, *args, **kwargs):
> chan.send(func(*args, **kwargs))
>
> Cheers,
> Richard.
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless
More information about the Stackless
mailing list