【Python】使用 aysncio 异步编程获取协程返回值

使用 aysncio 异步编程获取协程返回值

author: jayzhen
date: 20240816

方案

  • 协程返回值的四种方式:
    • 通过 asyncio.ensure_future 获取
    • 使用 asyncio.get_event_loopcreate_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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值