蟒ASYNCIO add_done_callback与异步DEF
问题描述:
我有2个功能:第一个,def_a
,是一个异步功能,第二个是def_b
这是一个普通的函数和调用的def_a
结果作为与add_done_callback
功能的回调。蟒ASYNCIO add_done_callback与异步DEF
我的代码如下所示:
import asyncio
def def_b(result):
next_number = result.result()
# some work on the next_number
print(next_number + 1)
async def def_a(number):
await some_async_work(number)
return number + 1
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(def_a(1))
task.add_done_callback(def_b)
response = loop.run_until_complete(task)
loop.close()
而且它的工作完美。
当第二个函数def_b
变得异步时,问题就开始了。现在,它看起来像这样:
async def def_b(result):
next_number = result.result()
# some asynchronous work on the next_number
print(next_number + 1)
但现在我不能把它提供给add_done_callback
功能,因为它不是一个普通的功能。
我的问题是 - 如果def_b
是异步的,是否有可能以及如何向add_done_callback
函数提供def_b
函数?
答
add_done_callback
被认为是“低级”接口。当与协同程序时,您可以chain them在许多方面,例如:
import asyncio
async def my_callback(result):
print("my_callback got:", result)
return "My return value is ignored"
async def coro(number):
await asyncio.sleep(number)
return number + 1
async def add_success_callback(fut, callback):
result = await fut
await callback(result)
return result
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(coro(1))
task = add_success_callback(task, my_callback)
response = loop.run_until_complete(task)
print("response:", response)
loop.close()
记住add_done_callback
仍然会调用回调,如果你的未来会引发异常(但调用result.result()
要再)。
感谢您分享,出于好奇,使用什么是确保将来使用等待my_coro在my_callback – laycat
'sure_future(coro)'只是队列'coro()'用于以后执行,并不会立即启动'coro ()'。 – Udi