Ali*_*sro 3 python asynchronous sanic
随着我读得越多,我觉得 python 中的 aysnc 更加愚蠢。所以我决定直接询问答案。如何更改以下代码(使用异步或类似方法)以获得所需的结果?另外,我怎样才能在烧瓶或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'
Run Code Online (Sandbox Code Playgroud)
基本上,我不想在返回 main_job 之前等待 long_job 结束。先感谢您。:)
等待 asynciosleep()为其他工作腾出时间(如果您不需要等待其他事情)。使用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')
Run Code Online (Sandbox Code Playgroud)
您的框架应该启动事件循环,您不必自己启动它。您可以从框架调用的函数中await进行调用create_task,具体取决于您是否想要阻止。main_job()async def
如果您想在没有框架的情况下测试它,则必须使用 自己启动循环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())
Run Code Online (Sandbox Code Playgroud)
如果您自己实现一个框架,您可以使用更原始的loop.run_forever(),但您必须stop()自己实现。
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |