Twisted 上的生成器回调延迟
Generator callbacks on Twisted deferred
我正尝试在 Twisted 延迟的回调链中跳来跳去,使用 return 生成器的回调。考虑以下片段:
from twisted.internet import defer
def callback_one(result):
print('Callback one: got "{}", will raise ZeroDivisionError'.format(result))
raise ZeroDivisionError
# yield
def errback_two(failure):
print('Errback two: handled "{}", recovering'.format(failure.type))
return 'recovered'
def callback_three(result):
print('Callback three: got "{}"'.format(result))
return 'Final result'
if __name__ == '__main__':
d = defer.Deferred()
d.addCallback(callback_one)
d.addErrback(errback_two)
d.addCallback(callback_three)
d.callback('First result')
它的输出是
Callback one: got "First result", will raise ZeroDivisionError
Errback two: handled "<class 'ZeroDivisionError'>", recovering
Callback three: got "recovered"
但是,如果 yield
从 callback_one
中取消注释,我只会得到
Callback three: got "<generator object callback_one at 0x104603af0>"
如果我理解正确,发生的事情是第一个回调 return 是一个生成器,它直到为时已晚才被评估,异常没有被捕获,因此 errback 没有被调用。
总而言之,问题是:如果回调 return 是一个生成器,我如何以一种被延迟对象捕获的方式引发异常,从而触发 errback 链?
我是一个 Twisted 初学者,所以也许我尝试做的是一个糟糕的练习,甚至 impossible/really 很难实现,如果是这样的话请告诉我。提前致谢!
如果我没理解错的话,要获得如注释掉 yield
那样的结果,您需要调用生成器。为此,您可以创建另一个只执行生成器的函数,并对您的主函数做一个小改动:
def exec_gen(gen):
"""
Execute the generator
"""
for x in gen:
print(x)
# ...
if __name__ == '__main__':
d = defer.maybeDeferred(exec_gen, callback_one('First result'))
d.addErrback(errback_two)
d.addCallback(callback_three)
我正尝试在 Twisted 延迟的回调链中跳来跳去,使用 return 生成器的回调。考虑以下片段:
from twisted.internet import defer
def callback_one(result):
print('Callback one: got "{}", will raise ZeroDivisionError'.format(result))
raise ZeroDivisionError
# yield
def errback_two(failure):
print('Errback two: handled "{}", recovering'.format(failure.type))
return 'recovered'
def callback_three(result):
print('Callback three: got "{}"'.format(result))
return 'Final result'
if __name__ == '__main__':
d = defer.Deferred()
d.addCallback(callback_one)
d.addErrback(errback_two)
d.addCallback(callback_three)
d.callback('First result')
它的输出是
Callback one: got "First result", will raise ZeroDivisionError
Errback two: handled "<class 'ZeroDivisionError'>", recovering
Callback three: got "recovered"
但是,如果 yield
从 callback_one
中取消注释,我只会得到
Callback three: got "<generator object callback_one at 0x104603af0>"
如果我理解正确,发生的事情是第一个回调 return 是一个生成器,它直到为时已晚才被评估,异常没有被捕获,因此 errback 没有被调用。
总而言之,问题是:如果回调 return 是一个生成器,我如何以一种被延迟对象捕获的方式引发异常,从而触发 errback 链?
我是一个 Twisted 初学者,所以也许我尝试做的是一个糟糕的练习,甚至 impossible/really 很难实现,如果是这样的话请告诉我。提前致谢!
如果我没理解错的话,要获得如注释掉 yield
那样的结果,您需要调用生成器。为此,您可以创建另一个只执行生成器的函数,并对您的主函数做一个小改动:
def exec_gen(gen):
"""
Execute the generator
"""
for x in gen:
print(x)
# ...
if __name__ == '__main__':
d = defer.maybeDeferred(exec_gen, callback_one('First result'))
d.addErrback(errback_two)
d.addCallback(callback_three)