Python 的 Async/Await 的“Fire and Forget”
在 Python 的 async/await 语法中,执行异步函数而不等待它并不'达到预期的“即发即忘”效果。相反,程序会退出并显示运行时警告。
asyncio.Task for “Fire and Forget”
要在 asyncio 中实现“fire andforget”,请使用 asyncio。任务创建一个在后台执行所需操作的任务。通过调用 asyncio.ensure_future(async_foo()),与 async_foo() 关联的任务将启动,并且不会等待其完成。对于不需要显式等待的异步操作,这是一种简单而有效的方法。
async 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()
完成待处理任务
请注意,使用 asyncio 创建的任务。任务预计在事件循环结束之前完成。如果任务仍处于待处理状态,则会生成警告。为了防止这种情况,请在事件循环完成后显式等待所有待处理任务。
async def main(): asyncio.ensure_future(async_foo()) # Fire and forget async_foo() loop = asyncio.get_event_loop() await asyncio.gather(*asyncio.Task.all_tasks())
取消任务而不是等待
或者,如果您不想无限期等待某些任务,您可以取消它们:
async def echo_forever(): while True: print("Echo") await asyncio.sleep(1) async def main(): asyncio.ensure_future(echo_forever()) # Fire and forget echo_forever() loop = asyncio.get_event_loop() for task in asyncio.Task.all_tasks(): task.cancel() with suppress(asyncio.CancelledError): await task
以上是如何利用Python的Async/Await真正实现'Fire and Forget”?的详细内容。更多信息请关注PHP中文网其他相关文章!