callLater(延迟执行,多少秒后执行某任务)
1 2 3 4 5 6 7 8 9 10 11 12 13
| from twisted.internet import reactor
def f(s): print('this will run 3.5 seconds after it was scheduled: %s' % s) reactor.stop()
reactor.callLater(3.5, f, 'hello, world')
reactor.run()
|
LoopingCall间隔时间执行某任务
1 2 3 4 5 6 7 8 9 10
| from twisted.internet import reactor, task
def f(s): print(s)
loop = task.LoopingCall(f, 'hello, world')
loop.start(1)
reactor.run()
|
各种callback
ErrorBack
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from twisted.internet import reactor, defer
def get_dummpy_data(input_data): print('get_dummpy_data called') deferred = defer.Deferred() if input_data % 2 == 0: reactor.callLater(2, deferred.callback, input_data * 3) else: reactor.callLater(2, deferred.errback, ValueError('You used an odd number!')) return deferred
def cb_print_data(result): print('Result received: {}'.format(result))
def eb_print_error(failure): print(failure)
deferred = get_dummpy_data(2) deferred.addCallback(cb_print_data) deferred.addErrback(eb_print_error)
reactor.callLater(4, reactor.stop) reactor.run()
|
多个callback之间的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| from twisted.internet import reactor, defer
def getDeferredFromSomewhere(num): deferred = defer.Deferred() if num >= 5: reactor.callLater(0, deferred.callback, num / 3)
return deferred
def eb1(res): print("eb1", res) raise Exception("error1")
def eb2(res): print("eb2", res) raise Exception("error2")
def cb1(res): print("cb1", res) raise Exception("error3")
def cb2(res): print("cb2", res) raise Exception("error4")
d = getDeferredFromSomewhere(10) d.addCallback(cb1) d.addErrback(eb1) d.addCallback(cb2) d.addErrback(eb2)
reactor.callLater(4, reactor.stop)
reactor.run()
result: cb1 3.3333333333333335 eb1 [Failure instance: Traceback: <class 'Exception'>: error3 eb2 [Failure instance: Traceback: <class 'Exception'>: error1
|
DeferredList
当碰到需要等待多个 deferred 执行完毕的时候,我们可以使用 DeferredList
1
| dl = defer.DeferredList([deferred1, deferred2, deferred3])
|
看个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from twisted.internet import defer
def print_result(result): for (success, value) in result: if success: print('Success:', value) else: print('Failure:', value.getErrorMessage())
deferred1 = defer.Deferred() deferred2 = defer.Deferred() deferred3 = defer.Deferred()
dl = defer.DeferredList([deferred1, deferred2, deferred3], consumeErrors=True)
dl.addCallback(print_result)
deferred1.callback('one') deferred2.errback(Exception('bang!')) deferred3.callback('three')
|