我有两个函数:第一个是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

推荐答案

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()

请记住,如果您的future 引发异常,add_done_callback仍将调用回调(但调用result.result()将引发异常).

Python-3.x相关问答推荐

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

从.csv导入将文件夹路径加入到文件名

逐行比较2个Pandas数据帧,并对每一行执行计算

如何将项目添加到Python中具有固定大小的列表列表中

使用 Fetch 提交表单到 Django 视图

Python - 根据条件附加 NULL 值

为什么不能用格式字符串 '-' 绘制点?

Pygame 错误地渲染等距图像

总结基于条件的值,如果不匹配则保留当前值

魔术8球txt文件列表

聚合(aggregate)为最多包含两个元素的列表

如何从字典中打印特定键值?

Python:pprint的模块错误,打印没有错误

全局捕获快速 api 中的异常

Pandas 的 EMA 与股票的 EMA 不匹配?

Python中的多行日志(log)记录

用于 Django 应用程序的 Cython:它会工作吗?

警告:请使用 tensorflow/models 中的官方/mnist/dataset.py 等替代方案

如何修复:cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客户端库 - Python

在动态链接库 Anaconda3\Library\bin\mkl_intel_thread.dll 中找不到序数 242