将同步重写为异步:不等待函数
rewriting sync as async: not wait on a func
越看越觉得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结束。先感谢您。 :)
等待 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')
你的框架应该启动事件循环,你不必自己启动它。您可以 await
或从框架调用的 async def
函数调用 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中的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结束。先感谢您。 :)
等待 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')
你的框架应该启动事件循环,你不必自己启动它。您可以 await
或从框架调用的 async def
函数调用 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()
。