[Twisted-Python] a question ablout DeferredList
i have a sample code about DeferredList like this: from twisted.internet import reactor, defer def printResult(results): for resultInfo in results: success, result = resultInfo if success: print result reactor.stop() def addTen(result): return result + " ten" deferred1 = defer.Deferred() deferred2 = defer.Deferred() deferred3 = defer.Deferred() dl = defer.DeferredList([deferred1, deferred2, deferred3]).addCallback(printResult) deferred1.callback('one') deferred2.callback('two') deferred3.callback('three') reactor.run() then i run this code, it print: one two three but the reactor never stop even i have call reactor.stop() on printResult, i press CTRL+C, some error happen: Unhandled error in Deferred: Traceback (most recent call last): File "/usr/local/lib/python2.4/site-packages/twisted/internet/defer.py", line 317, in _runCallbacks self.result = callback(self.result, *args, **kw) File "/usr/local/lib/python2.4/site-packages/twisted/internet/defer.py", line 507, in _cbDeferred self.callback(self.resultList) File "/usr/local/lib/python2.4/site-packages/twisted/internet/defer.py", line 239, in callback self._startRunCallbacks(result) File "/usr/local/lib/python2.4/site-packages/twisted/internet/defer.py", line 304, in _startRunCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/local/lib/python2.4/site-packages/twisted/internet/defer.py", line 317, in _runCallbacks self.result = callback(self.result, *args, **kw) File "defer5.py", line 8, in printResult reactor.stop() File "/usr/local/lib/python2.4/site-packages/twisted/internet/base.py", line 342, in stop raise RuntimeError, "can't stop reactor that isn't running" exceptions.RuntimeError: can't stop reactor that isn't running plz help me, thank you!
On 2 Jan, 2007, at 18:32, hzqij wrote:
i have a sample code about DeferredList like this:
from twisted.internet import reactor, defer
def printResult(results): for resultInfo in results: success, result = resultInfo if success: print result reactor.stop()
def addTen(result): return result + " ten"
deferred1 = defer.Deferred() deferred2 = defer.Deferred() deferred3 = defer.Deferred() dl = defer.DeferredList([deferred1, deferred2, deferred3]).addCallback(printResult) deferred1.callback('one') deferred2.callback('two') deferred3.callback('three')
At this point, printResult() will get called, because you just fired all the deferreds in the DeferredList. But, your printResult() assumes the reactor is running, and you haven't started it yet ...
reactor.run()
It seems to me that if all you're doing is trying out Deferred/ DeferredList, you could just remove the calls to reactor.stop/start (): It kind of depends on what your sample code is going to be doing. --Grant
then i run this code, it print:
one two three
but the reactor never stop even i have call reactor.stop() on printResult, i press CTRL+C, some error happen:
Unhandled error in Deferred: Traceback (most recent call last): File "/usr/local/lib/python2.4/site-packages/twisted/internet/ defer.py", line 317, in _runCallbacks self.result = callback(self.result, *args, **kw) File "/usr/local/lib/python2.4/site-packages/twisted/internet/ defer.py", line 507, in _cbDeferred self.callback(self.resultList) File "/usr/local/lib/python2.4/site-packages/twisted/internet/ defer.py", line 239, in callback self._startRunCallbacks(result) File "/usr/local/lib/python2.4/site-packages/twisted/internet/ defer.py", line 304, in _startRunCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/local/lib/python2.4/site-packages/twisted/internet/ defer.py", line 317, in _runCallbacks self.result = callback(self.result, *args, **kw) File "defer5.py", line 8, in printResult reactor.stop() File "/usr/local/lib/python2.4/site-packages/twisted/internet/ base.py", line 342, in stop raise RuntimeError, "can't stop reactor that isn't running" exceptions.RuntimeError: can't stop reactor that isn't running
plz help me, thank you! _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
On 1/3/07, Grant Baillie <grant@osafoundation.org> wrote:
It seems to me that if all you're doing is trying out Deferred/ DeferredList, you could just remove the calls to reactor.stop/start (): It kind of depends on what your sample code is going to be doing.
Or use reactor.callLater: from twisted.internet import reactor, defer def printResult(results): for resultInfo in results: success, result = resultInfo if success: print result reactor.stop() def doIt(): deferred1 = defer.Deferred() deferred2 = defer.Deferred() deferred3 = defer.Deferred() dl = defer.DeferredList([deferred1, deferred2, deferred3]).addCallback(printResult) deferred1.callback('one') deferred2.callback('two') deferred3.callback('three') reactor.callLater(0.0, doIt) reactor.run() -- Felipe.
participants (3)
-
Felipe Almeida Lessa -
Grant Baillie -
hzqij