蟒ASYNCIO add_done_callback与异步DEF

蟒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()要再)。

+0

感谢您分享,出于好奇,使用什么是确保将来使用等待my_coro在my_callback – laycat

+1

'sure_future(coro)'只是队列'coro()'用于以后执行,并不会立即启动'coro ()'。 – Udi