带有异步 def 的 python asyncio add_done_callback

新手上路,请多包涵

我有 2 个函数:第一个 def_a 是异步函数,第二个是 def_b 是一个常规函数,调用结果为 def_a 作为 add_done_callback 函数的回调。

我的代码如下所示:

 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 函数?

原文由 Yuval Pruss 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

add_done_callback 被认为是“低级”接口。使用协程时,您可以通过多种方式 链接它们,例如:

 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() 将引发它)。

原文由 Udi 发布,翻译遵循 CC BY-SA 4.0 许可协议

这仅适用于未来的一项工作,如果您有多个异步工作,它们将相互阻塞,更好的方法是使用 asyncio.as_completed() 迭代未来列表:

 import asyncio

async def __after_done_callback(future_result):
    # await for something...
    pass

async def __future_job(number):
    await some_async_work(number)
    return number + 1

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(__future_job(x)) for x in range(100)]  # create 100 future jobs

for f in asyncio.as_completed(tasks):
    result = await f
    await __after_done_callback(result)

loop.close()

原文由 user3593261 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题