使用 aysncio 异步编程获取协程返回值
author: jayzhen
date: 20240816
方案
- 协程返回值的四种方式:
- 通过
asyncio.ensure_future
获取 - 使用
asyncio.get_event_loop
的create_task
方法 , 获取返回值 - 使用
callback
await 内容运行完,就会运行 callback 方法 - 使用
partial
模块向 callback 函数中传入值
- 通过
代码实践
# -*- coding: utf-8 -*-"""
@author: jay
@version: Python 3.8+
@file: demo.py
@time: 2024/8/16 19:12
"""import asyncio
from functools import partialasync def work(name):print(f"work function run.")await asyncio.sleep(0.5)return f"{name} working!"async def smoke(name):print(f"smoke function run.")await asyncio.sleep(0.5)return f"{name} smoking!"def callback(future):result = future.result()print(f"callback accept result:{result}")def callback_with(param, future):result = future.result()print(f"callback accept result:{result} {param}")def use_ensure_future_for_return():"""通过ensure_future获取,本质是future对象中的result方法"""loop = asyncio.get_event_loop()get_future1 = asyncio.ensure_future(work("moyu"))get_future2 = asyncio.ensure_future(smoke("huazi"))loop.run_until_complete(get_future1)loop.run_until_complete(get_future2)print(get_future1.result())print(get_future2.result())loop.close()def use_create_task_for_return():"""使用 asyncio.get_event_loop() 自带的 create_task, 获取返回值"""loop = asyncio.get_event_loop()task1 = loop.create_task(work("moyu"))task2 = loop.create_task(smoke("huazi"))loop.run_until_complete(task1)loop.run_until_complete(task2)print(task1.result())print(task2.result())loop.close()def use_callback_for_return():"""使用callback, 一旦await地方的内容运行完,就会运行callback"""loop = asyncio.get_event_loop()task1 = loop.create_task(work("moyu"))task2 = loop.create_task(smoke("huazi"))task1.add_done_callback(callback)task2.add_done_callback(callback)loop.run_until_complete(task1)loop.run_until_complete(task2)print(task1.result())print(task2.result())loop.close()def use_partial_for_return():"""使用partial这个模块向callback函数中传入值"""loop = asyncio.get_event_loop()task1 = loop.create_task(work("moyu"))task2 = loop.create_task(work("huazi"))task1.add_done_callback(partial(callback_with, "work"))task2.add_done_callback(partial(callback_with, "smoke"))loop.run_until_complete(task1)loop.run_until_complete(task2)print(task1.result())print(task2.result())loop.close()if __name__ == "__main__":"""# 注意:由于回调函数已经处理了打印结果,这里不需要再次打印result# 如果需要查看结果,可以在回调函数中处理# 或者在回调之外的地方检查任务状态(例如,在事件循环结束后)"""# use_ensure_future_for_return()# use_create_task_for_return()# use_callback_for_return()use_partial_for_return()