栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

“Fire and forget” python async/await

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

“Fire and forget” python async/await

如果你使用的是

Python> = 3.7
,请在任何地方替换
asyncio.ensure_future
asyncio.create_task
最新的,更好的派生task的方法。

asyncio.Task到“激发并忘记”

根据

python docs
asyncio.Task
说法,有可能启动一些协程以“在后台”执行。
asyncio.ensure_future
函数创建的任务不会阻止执行(因此函数将立即返回!)。这似乎是你要求的一种“解雇”的方法。

import asyncioasync def async_foo():    print("async_foo started")    await asyncio.sleep(1)    print("async_foo done")async def main():    asyncio.ensure_future(async_foo())  # fire and forget async_foo()    # btw, you can also create tasks inside non-async funcs    print('Do some actions 1')    await asyncio.sleep(1)    print('Do some actions 2')    await asyncio.sleep(1)    print('Do some actions 3')if __name__ == '__main__':    loop = asyncio.get_event_loop()    loop.run_until_complete(main())

输出:

Do some actions 1async_foo startedDo some actions 2async_foo doneDo some actions 3

如果事件循环完成后正在执行任务怎么办?
请注意,

asyncio
期望任务在事件循环完成时完成。因此,如果你更改
main()
为:

async def main():    asyncio.ensure_future(async_foo())  # fire and forget    print('Do some actions 1')    await asyncio.sleep(0.1)    print('Do some actions 2')程序完成后,你会收到以下警告:Task was destroyed but it is pending!task: <Task pending coro=<async_foo() running at [...]

为防止这种情况,你可以在事件循环完成后等待所有待处理的任务:

async def main():    asyncio.ensure_future(async_foo())  # fire and forget    print('Do some actions 1')    await asyncio.sleep(0.1)    print('Do some actions 2')if __name__ == '__main__':    loop = asyncio.get_event_loop()    loop.run_until_complete(main())    # Let's also finish all running tasks:    pending = asyncio.Task.all_tasks()    loop.run_until_complete(asyncio.gather(*pending))

杀死任务而不是等待任务

有时你不想等待任务完成(例如,某些任务可能创建为永久运行)。在这种情况下,你可以只取消()而不是等待它们:

import asynciofrom contextlib import suppressasync def echo_forever():    while True:        print("echo")        await asyncio.sleep(1)async def main():    asyncio.ensure_future(echo_forever())  # fire and forget    print('Do some actions 1')    await asyncio.sleep(1)    print('Do some actions 2')    await asyncio.sleep(1)    print('Do some actions 3')if __name__ == '__main__':    loop = asyncio.get_event_loop()    loop.run_until_complete(main())    # Let's also cancel all running tasks:    pending = asyncio.Task.all_tasks()    for task in pending:        task.cancel()        # Now we should await task to execute it's cancellation.        # Cancelled task raises asyncio.CancelledError that we can suppress:        with suppress(asyncio.CancelledError): loop.run_until_complete(task)

输出:

Do some actions 1echoDo some actions 2echoDo some actions 3echo


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号