gpt4 book ai didi

python - 将同步重写为异步 : not wait on a func

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:14 25 4
gpt4 key购买 nike

越看越觉得python中的aysnc更蠢。所以我决定要求一个直接的答案。我如何更改以下代码(使用异步或类似方法)以获得所需的结果?另外,如何在 flask 或 sanic 中进行?

import time

def long_job():
print('long job started')
time.sleep(5)
print('long job ended')

def main_job():
long_job()
time.sleep(1)
print('main job returned')

main_job()

# expected result:
# 'long job started'
# 'main job returned'
# 'long job ended'

基本上,我不想在返回 main_job 之前等待 long_job 结束。先感谢您。 :)

最佳答案

Await asyncio 的 sleep() 将时间让给其他作业(如果您不需要等待其他作业)。使用 create_task() 而不是 await 来开始一个没有阻塞的工作。最后,您必须使用事件循环开始主要工作。

# Written in Python 3.7
import asyncio

async def long_job():
print('long job started')
await asyncio.sleep(5)
print('long job ended')

async def main_job():
asyncio.create_task(long_job())
await asyncio.sleep(1)
print('main job returned')

你的框架应该启动事件循环,你不必自己启动它。您可以从框架调用的 async def 函数中 await 或在 main_job() 上调用 create_task,具体取决于是否要屏蔽。


如果您想在没有框架的情况下进行测试,则必须使用 asyncio.run() 自行启动循环。这将在其任务完成后立即停止,即使其他任务尚未完成。但这很容易变通:

async def loop_job():
asyncio.create_task(main_job())
while len(asyncio.Task.all_tasks()) > 1: # Any task besides loop_job()?
await asyncio.sleep(0.2)

asyncio.run(loop_job())

如果您自己实现一个框架,您可以使用更原始的loop.run_forever(),但您必须自己stop()

关于python - 将同步重写为异步 : not wait on a func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944116/

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