Greg Hewgill (ghewgill) wrote,
Greg Hewgill

continuations using stackless python

I've been pondering about how to implement continuations in my Psil interpreter. One choice is to redesign the whole thing to use continuation-passing style with the resulting performance hit. I've been putting off trying to do that.

It occurred to me to have a look at Stackless, which is a variant of Python that supports lightweight threads called "tasklets". It turns out this is ideal. Here is the complete implementation of continuations:

    def call_with_current_continuation(f):
        import stackless
        channel =
        return channel.receive()

That's it! Calling stackless.tasklet() creates a new tasklet object that will be scheduled later by Stackless. The function f is expected to take one parameter, which is itself a function that takes one parameter that will be returned from call_with_current_continuation. It turns out that channel.send is exactly such a function (bound member functions in Python are great). Then calling channel.receive() stops the current tasklet and waits for the new one to call channel.send with a parameter. Finally, the value is returned from call_with_current_continuation.

It took me a while to come up with this concise implementation, after reading the sparse Stackless documentation and tutorial. I had to let the concept of continuations and the philosophy of Stackless sink in a bit before this implementation became clear. I'm quite pleased with it.

Tags: continuations, psil, stackless

  • islands of the world tour 2009

    Amy and I haven't been back to North America to see family since we got married in 2007. We've been talking for a while about taking a trip back,…

  • changing travel plans

    Things are suddenly moving fast. It looks like Amy and I are going to try to make it to Austin in time for SXSW (that means leaving Canada around…

  • photos from the usa southwest trip

    I've finished culling, sorting, and organizing the photos that I took during our trip. There are 339 photos, 132 of which are in the "60 mi Gallery"…

  • Post a new comment


    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded