使用 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 partial
async 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()