[Twisted-Python] way of dealing with returning a deferred from a method/function
Bob Ippolito
bob at redivi.com
Wed Dec 3 21:38:50 EST 2003
On Dec 3, 2003, at 8:48 PM, Jonathan Simms wrote:
> This may seem obvious to everyone, but I had an insight into the use of
> deferreds today. It would always confuse me, I've got a method that's
> going to take quite a while to run. When something calls it, i want to
> immediately return a deferred. But how to accomplish this? returns
> (most
> frequently) come at the *end* of a function!
>
> I was thinking about it like this (hence my confusion):
>
> def aLongWait(stuff): # obviously incorrect
> d = defer.Deferred()
> return d
> result = doSomeStuffHere(stuff)
> d.callback(result)
>
>
> the little trick I figured out today is as follows:
>
> def aLongWait(stuff):
> d = defer.Deferred()
> def _():
> result = doSomeStuffHere(stuff)
> d.callback(result)
> reactor.callLater(0, _)
> return d
That's still totally wrong. You either need to defer doSomeStuffHere
to a thread (reactor.callInThread), or refactor "doSomeStuffHere" into
an iterator that only does a little bit each call.. and then call it
once a runloop until it's done, and when it's done you do the callback
with the result.
-bob
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2357 bytes
Desc: not available
Url : http://twistedmatrix.com/pipermail/twisted-python/attachments/20031203/5554079c/attachment.bin
More information about the Twisted-Python
mailing list