[Twisted-Python] xmlrpc deferred
Jp Calderone
exarkun at divmod.com
Fri May 27 13:46:21 MDT 2005
On Fri, 27 May 2005 22:28:06 +0300, Catalin Constantin <catalin at dazoot.ro> wrote:
>Hi there,
>
>I have the following xmlrpc method:
>
>class FeederResource(xmlrpc.XMLRPC):
> def __init__(self):
> xmlrpc.XMLRPC.__init__(self)
> self.feeder=Feeder()
>
> def xmlrpc_getList(self, id):
> return self.feeder.get_urls(id)
>
>The thing is that the self.feeder.get_urls takes too long to execute
>and while the request is running all the others are blocked.
>I want that while it computes the result the other XML RPC methods to
>be available.
The only answer here is to make get_urls() take less time.
What is it doing? Is it blocking on network I/O? Querying a database? Prompting for user input? _It_ should be creating and returned a Deferred (and later calling it back with a result), most likely, since it is the long-running operation.
>
>I wanted to use deferrals but i found no viable example.
>
>Eg what i've tried to do:
> def xmlrpc_getList(self, id):
> log.debug("getList is here for id %s" % id)
> d = defer.Deferred()
> d.addCallback(self.feeder.get_urls)
> return d
Deferred don't make things asynchronous, cooperative, or non-blocking. They only make dealing with callbacks more convenient. If you add a blocking function as the callback to a Deferred, it will block the reactor just as effectively as if you called it yourself (bacause all that happens inside the Deferred is that the function gets called).
>
>My method feeder.get_urls is never called !
>
In the above code, nothing ever "fires" the Deferred - calls .callback() on it - so, never having a result, it never bothers to invoke any of its callbacks. Deferred just hook results up to callbacks.
Jp
More information about the Twisted-Python
mailing list