[Twisted-Python] Question about Using Deferreds in ServerProtocol request Handler

Jean-Paul Calderone exarkun at divmod.com
Wed Feb 20 11:18:28 EST 2008

On Wed, 20 Feb 2008 07:51:41 -0800 (PST), Andrew Francis <andrewfr_ice at yahoo.com> wrote:
>Hi Folks:
>Much of what I do with Stackless involves making calls
>from server requests that in turn, make Twisted calls
>that return a deferred.
> [snip]
>I have been able to do the same thing with an
>class MyRequestHandler(http.Request):
>    @defer.inlineCallbacks
>    def process(self):
>        try:
>            result = yield client.getPage("http://www.google.com")
>        except Exception, err:
>            log.err(err, "process getPage call failed")
>        else:
>            self.setHeader('Content-Type', 'text/html')
>            self.write(result)
>            self.finish()
>(although this works, the technique is not general for
>all protocols)
>However, how is this done with just deferreds and
>callbacks without Stackless or inlineCallbacks?

inlineCallbacks just allows a syntactic transformation.  The above
definition of process is identical to this one:

    def process(self):
        def callback(result):
            self.setHeader('Content-Type', 'text/html')
        def errback(err):
            log.err(err, "process getPage call failed")
            d = client.getPage("http://www.google.com")
        except Exception:
            d = failure.Failure()
        d.addCallbacks(callback, errback)

Exactly the same thing happens in either case.  The difference is
that inlineCallbacks lets you implement the callback as the section
of a generator function after a yield statement and the errback as
the suite of an except statement enclosing a yield expression in the
generator function.  The transformation is almost (or maybe actually)
a mechanical one which just changes the structure of the code, not the
behavior it implements.  inlineCallbacks is still based on Deferreds,
they're just obscured from view slightly.


More information about the Twisted-Python mailing list