Python 中的异步编程通常涉及不需要立即关注的任务。处理此类任务的一种方法是使用“即发即忘”模式,该模式允许任务同时运行而不会阻塞主执行流程。
在Tornado的协程实现中,可以通过省略yield关键字来实现这种模式。然而,从 Python 3.5 开始,async/await 语法需要不同的方法。
根据 asyncio.Task 的 Python 文档,协程可以是通过使用 asyncio.ensure_future 创建任务来“在后台”执行。此任务将同时运行,不会阻塞该函数。
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() # ... Other code can be executed here ...
默认情况下,asyncio 期望任务在事件循环完成之前完成。如果事件循环完成后任务仍在运行,则会发出警告。为了避免此警告,应在事件循环完成后等待所有待处理的任务。
loop = asyncio.get_event_loop() loop.run_until_complete(main()) # Wait for any remaining tasks pending = asyncio.Task.all_tasks() await asyncio.gather(*pending)
在某些情况下,可能需要取消任务而不是等待任务。这可以使用 task.cancel() 来完成,但需要等待被取消的任务才能完成取消。
# ... Same code as before ... # Cancel all running tasks pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): await asyncio.wait_for(task, timeout=None)
以上是如何使用 Python 的 Async/Await 实现'Fire and Forget”?的详细内容。更多信息请关注PHP中文网其他相关文章!