1

随着我阅读的更多,我对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'

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

4

1 回答 1

3

等待 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')

您的框架应该启动事件循环,您不必自己启动它。您可以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())

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

于 2019-07-09T01:08:01.980 回答