[Twisted-web] xmlrpc blocking

Mary Gardiner mary-twisted at puzzling.org
Mon Jul 25 02:46:31 MDT 2005


On Mon, Jul 25, 2005, Rasjid Wilcox wrote:
> What should I be doing instead?

Writing code that doesn't block.

A Deferred object is not a sophisticated wrapper which writes
asynchronous code for you, ie, wrapping a blocking function in a
Deferred does not make it non-blocking. (A Deferred is more like an
abstraction for chains of callback functions.) Wrapping a blocking
function in a Deferred just means that your application blocks for a
while, and *then* the Deferred fires the callbacks.

The use case for defer.succeed is actually for when you have a result
that is synchronous but want to pass it code that expects Deferreds. For
example, if I have:

def null():
    return 3

and want to use it like this:

d = null()
d.addCallback(...)
d.addErrback(...)

then I can wrap null using defer.succeed.

Your example doesn't say why it is that you need a blocking function.
The reason will affect the way you choose to make it non-blocking:

 1. you may interrupt your blocking function periodically and allow
    Twisted to return to the main loop, using twisted.flow or defgen
    (see http://mesozoic.geecs.org/cogito/archives/000160.html and one
    day I will write it up...).

 2. you may use an existing Twisted function that does an asynchronous
    version of whatever your blocking function is, or call some third
    party asynchronous library.

 3. You may need to use deferToThread in order to run the blocking
    function in a thread: this is usually the case if you're using some
    libraries that can't easily be made non-blocking (my major personal
    use case has been the PIL, there are plenty of others).

-Mary



More information about the Twisted-web mailing list