“Fire and Forget”Python Async/Await
在异步编程中,无需等待即可执行非关键操作,这非常有用他们的完成。在 Tornado 中,这种“即发即忘”行为可以通过在协程中省略 Yield 关键字来实现。然而,在Python 3.5的async/await语法中,这种方法会导致运行时警告并且无法执行所需的操作。
解决方案:asyncio.Task
根据 Python 的 asyncio.Task 文档,它允许“在后台”执行协程。通过使用 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() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
输出:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
处理待处理任务
如果任务在事件循环完成后仍在执行,可能会显示警告。为了防止这种情况,事件循环完成后可以等待所有待处理的任务:
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
取消任务
在某些情况下,可能需要取消任务预计不会完成。这可以使用task.cancel()来实现:
# 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)
以上是如何在Python 3.5的Async/Await中实现'Fire and Forget”行为?的详细内容。更多信息请关注PHP中文网其他相关文章!