如何在Python中运行嵌套异步函数?

hgc7kmma  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(269)

有人能帮我弄清楚如何与程序的其余部分异步运行MethodTwo()吗?
代码如下:

import asyncio
from asgiref.sync import sync_to_async

def MethodTwo():
    print("MethodTwo")

async def MethodOne():
    print("MethodOne")
    await sync_to_async(MethodTwo)()

async def Main():
    print("Main")
    await sync_to_async(MethodOne)()

loop = asyncio.get_event_loop()
loop.run_until_complete(Main())
loop.close()

谢谢你的帮助。

6vl6ewon

6vl6ewon1#

使用asyncio.to_thread()方法(在Python3.10中添加的),这很容易。

import asyncio
import time

def MethodTwo():
    print("MethodTwo")
    time.sleep(2.0)
    print("MethodTwo done")

async def MethodOne():
    print("MethodOne")
    await asyncio.sleep(2.5)
    print("MethodOne done")

async def Main():
    print("Main")
    asyncio.create_task(asyncio.to_thread(MethodTwo))
    await MethodOne()

if __name__ == "__main__":
    asyncio.run(Main())

如果你想使用Python的早期版本,你可以使用ThreadPoolExecutor来实现同样的功能,它需要多几行代码,但工作方式是一样的。
函数to_sleep基本上是ThreadPoolExecutor周围的 Package 器。
在asyncio程序的主线程中执行sync函数会阻塞事件循环。如果函数很快,这不是问题,在任何程序中都是很正常的。但是如果函数需要一段时间才能执行,那么其他任务将被停止。我想这就是你真正想问的。如果不使用辅助线程或进程,没有解决方案是不可能的。

相关问题