gpt4 book ai didi

异步函数完成后的Python调用回调

转载 作者:行者123 更新时间:2023-12-04 14:48:09 25 4
gpt4 key购买 nike

一旦异步函数运行完毕,我就会尝试调用回调

这是我尝试做的一个例子:

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

关于异步函数完成后的Python调用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55003789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com