twisted 的 延迟(deferred)的概述与用法

1. deffered 延迟链:

将多个回调加入延时链中,第一个回调函数用deffer.callback(a)调用,a是传入的一个参数,必须要有一个参数才能调用第一个回调函数。第二个回调使用第一个回调的结果调用。如果出现异常,将绕过回调链,所以每定一个回调用函数,都要让回调函数接受一个参数。

# 创建回调函数,每个回调函数都要接受至少一个参数
def myfun(a):
    input("myinput:")   # 会在这里阻塞
    print("My fun1 %d" % (a+100))
    return 1
def myfun2(b):
    print("My fun2 %d" % (b+100))
    return 2

d = defer.Deferred()    # 创建Deferred对象
d.addCallback(myfun)    # 添加第一个回调
d.addCallback(myfun2)   # 添加第二个回调,第一个回调的返回结果会传给第二个回调
d.callback(0)           # 填一个参数,这个参数会传给第一个回调,以启动第一个回调
回调的结果总是作为第一个参数传递给下一个回调,从而创建一个处理器链。如果回调引发异常,请切换到errback。

2. DeferredList,让所有回调函数都执行结束了再通知

在不同几个事件发生后得到通知,而不是单独等待每一个事件。可以用 twisted.internet.defer.deferredlist创建一个 DefferedList()之后,可以用它的addCallbacks()来添加回调函数。当所有的延迟完成时,DefferedList()会调用其回调函数,回调函数将使用它包含的延迟结果列表。

def printResult(result):
    for (success, value) in result:
        if success:
            print('Success:', value)
        else:
            print('Failure:', value.getErrorMessage())

def myfun1(a):
    input("myinput1:")
    print(a)
    return a

def myfun2(b):
    input("myinput2:")
    print(b)
    return b

def myfun3(c):
    input("myinput3:")
    print(c)
    return c

# 创建3个延迟
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred3 = defer.Deferred()

# 为每个延时添加调用
deferred1.addCallback(myfun1)
deferred2.addCallback(myfun2)
deferred3.addCallback(myfun3)

# 把三个延迟打包在一起,成为一个DeferredList对象
dl = defer.DeferredList([deferred1, deferred2, deferred3], consumeErrors=True)

# 添加回调,等所有延迟完成了,会调用这个回调,把延迟的结果传给它
dl.addCallback(printResult)

# Fire our three deferreds with various values.
deferred1.callback('one')   # 调用 myfun1() 并把"one"传给它
deferred2.errback(Exception('bang!'))
deferred3.callback('three')

 

本文参考文章:

Deferred Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值