[Stackless] Calling a tasklet with a return value with the C API

Kristján Valur Jónsson kristjan at ccpgames.com
Thu Dec 31 12:06:46 CET 2009

First, you have to figure out how to do it purely in python.  There is no automatic "wait" semantic built in.  The return value from the toplevel tasklet function just  vanishes.

The typical way is to create a channel:
c = stackless.channel()
def func(*args):
   return "this result string will vanish"

stackless.tasklet(func)(arg1, ...)
result = c.receive()


From: A M [mailto:aelorean at gmail.com]
Sent: 29. desember 2009 19:50
To: Kristján Valur Jónsson
Cc: stackless at stackless.com
Subject: Re: [Stackless] Calling a tasklet with a return value with the C API

Yes, I obviously got so excited in thinking I found a good example of what I was interested in knowing, that I didn't think it through carefully.  PyTasklet_New() returns a PyTaskletObject*, so I already knew how to recreate that particular line of python.

However, that aside, is it at all possible to acquire a result value from a function executed as a tasklet using the C API?   Let's say you have a function that is acquiring a dict of data from an online database that you want to run as a tasklet, but you need the return value.   How is such a thing done purely in C/C++?
2009/12/29 Kristján Valur Jónsson <kristjan at ccpgames.com<mailto:kristjan at ccpgames.com>>
producers[int(ind)] = stackless.tasklet(producer)(ind,sleeptime)

this line will create a tasklet bound to the "producer" callable, bind it to (ind, sleeptime) and return it to the "producers" list.
Setting up a tasklet simply returns the same tasklet object, exactly so that you can do the following:
producers[int(ind)] = stackless.tasklet(producer)
producers[int(ind)](ind, sleeptime)

in one line.
There is no "return value" from the tasklet in play here.
in short:
stackless.tasklet.__call__(self, *args)
returns self.


From: stackless-bounces at stackless.com<mailto:stackless-bounces at stackless.com> [mailto:stackless-bounces at stackless.com<mailto:stackless-bounces at stackless.com>] On Behalf Of A M
Sent: 29. desember 2009 09:09
To: stackless at stackless.com<mailto:stackless at stackless.com>
Subject: [Stackless] Calling a tasklet with a return value with the C API

After a few years of scouring the Internet for example code and viewing the very sparse documentation on the subject, I have been able to successfully utilize almost all aspects of the C API with regard to stackless python.  I feel pretty comfortable with most all functions declared in stackless_api.h.

However, there is one thing I cannot figure out and cannot find an example for anywhere:  running a tasklet with the C API that returns a value.  Take, for example, this python code from one of the stackless python examples online (http://stacklessexamples.googlecode.com/svn/trunk/examples/producerConsumerTextmode.py):

def launch_p (ind,sleeptime):         # Launches and initializes the producers lists
    producers[int(ind)] = stackless.tasklet(producer)(ind,sleeptime)

The last line is the one that I have no idea how to recreate.  Certainly, creating a tasklet, setting it up, and running it is trivial; however, I cannot for the life of me figure out how you would get a return value with the C API.   My initial thought was perhaps the results are sent back on a 'channel'; however, I do not see any documentation that supports that, nor can I find any examples of it.

Anyway, can anyone help me out with this?  It's keeping me awake at night!   If not, can someone give me a contact address for one of the developers of stackless that wrote the C API for it?


ps.  By the way, does anyone know why this link indicates that it's the C/C++ API for stackless 2.6.4 but has none of the stackless functions within it?  -> http://www.disinterest.org/resource/stackless/2.6.4-docs-html/c-api/index.html

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.stackless.com/pipermail/stackless/attachments/20091231/1b8e66dc/attachment.htm>

More information about the Stackless mailing list