在某些场景下,需要启动一个不需要等待其完成的异步操作。传统上,Tornado 协程中的“即发即忘”方法可以通过省略 Yield 关键字来实现。
然而,在 Python 3.5 的 async/await 语法中,这样的实现会引发 RuntimeWarning,表明协程
幸运的是,Python 的 asyncio 库通过其 asyncio.Task 类提供了一个解决方案。这允许创建一个可以在后台执行的任务,而不会阻塞主执行。
import asyncio 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() # continue with other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
这种方法确保 async_foo() 异步执行,而其他操作可以继续执行而无需等待。
需要注意的是,当事件循环完成时,asyncio 期望所有任务都完成。因此,任何剩余的待处理任务都可能导致警告。为了防止这种情况,可以等待所有待处理任务或取消它们。
选项 1:等待待处理任务
pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
选项 2:取消待处理任务任务
pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): loop.run_until_complete(task)
通过取消任务,它们将从事件循环的时间表中删除,从而防止任何潜在的警告。
以上是如何在 Python Async/Await 中实现'Fire and Forget”异步操作?的详细内容。更多信息请关注PHP中文网其他相关文章!