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

猜你喜欢

转载自blog.csdn.net/u013948858/article/details/141267962