[plain text]

import stackless
from twisted.internet import defer

def deferredTasklet(func):
    I'm a function decorator that makes a stacklessy-function (one
    that might 'block', etc) into one that returns a Deferred for
    integrating with Twisted.

    XXX: Do a hack so the name of 'replacement' is the name of 'func'.
    def replacement(*args, **kwargs):
        d = defer.Deferred()
        def tasklet(*args, **kwargs):
                d.callback(func(*args, **kwargs))
            print "hey, I just callbacked or errbacked."
        print "task...", func.__name__
        crap = stackless.tasklet(tasklet)(*args, **kwargs)
        print "...let", func.__name__, crap
        return d
    return replacement

def blockOn(d):
    Use me in stacklessy-code to wait for a Deferred to fire.
    XXX: If the result is an failure, raise its exception.
    ch =
    def cb(r):
        print "blockOnCB", r
    return ch.receive()

def TEST():
    Show off deferredTasklet and blockOn.
    from twisted.internet import reactor

    import time
    #let's make sure we're not blocking anywhere
    def timer():
        print "time!", time.time()
        reactor.callLater(0.5, timer)
    reactor.callLater(0, timer)

    def getDeferred():
        d = defer.Deferred()
        reactor.callLater(3, d.callback, 'goofledorf')
        print "blocking on", d
        r = blockOn(d)
        print "got", r, "from blocking"
        return r

    getDeferred = deferredTasklet(getDeferred)

    # below is our 'legacy' Twisted code that only knows about
    # Deferreds, not crazy stackless stuff.

    print "getDeferred is", getDeferred
    d = getDeferred()
    print "d is", d

    def _cbJunk(r):
        print "RESULT", r

    print "kicking it off!"

if __name__ == '__main__':