异步函数完成后的Python回调

2022-03-25 00:00:00 python python-asyncio

问题描述

我正在尝试在异步函数运行完成后调用回调

以下是我尝试执行的操作的示例:

import asyncio

async def asyncfunction():
    print('Hello')
    await asyncio.sleep(10)
    print('World')
    return 10

def callback(n):
    print(f'The async function returned: {n}')

loop = asyncio.get_event_loop()

# Will block the print until everything is done
callback(loop.run_until_complete(asyncfunction()))
print('Hey')

这是它的作用:

Hello
World
The async function returned: 10
Hey

我希望它这样做
编辑:"嘿"的位置并不重要,只要它不需要等待异步函数完成

Hello
Hey
World
The async function returned: 10

编辑:经过一些测试,我找到了一种做我想做的事情的方法,尽管我不知道这是否是最好的方法

import asyncio
import threading

async def asyncfunction():
    print('Hello')
    await asyncio.sleep(10)
    print('World')
    return 10

def callback(n):
    print(f'The async function returned: {n}')

def wrapper(loop):
    callback(loop.run_until_complete(asyncfunction()))

loop = asyncio.get_event_loop()
thr = threading.Thread(target=wrapper,args=(loop,))
thr.start()
print('Hey')

解决方案

将线程与Asyncio一起使用令人困惑,而且很可能不是您想要的。run_until_complete是阻塞调用之一,很可能是asyncio程序中的最后一条语句。

要在调用异步函数后添加代码,只需创建创建包装

async def myfunc():
  n = await asyncfunction()
  callback(n)

loop.run_until_complete(myfunc()) # from python 3.7, asyncio.run(myfunc())

如果您只想安排一些代码异步运行并继续执行其他操作,请创建一个任务并在结束时等待

async def a_main():
  task = asyncio.ensure_future(myfunc()) # from python 3.7, asyncio.create_task(...)
  print("Hey")
  # Anything else to run
  await task # wait for the task to complete

loop.run_until_complete(a_main())

相关文章