"Fire and Forget" Python Async/Await
In asynchronous programming, it can be useful to perform non-critical operations without waiting for their completion. In Tornado, this "fire and forget" behavior can be achieved by omitting the yield keyword in a coroutine. However, in Python 3.5's async/await syntax, this approach results in a runtime warning and the non-execution of the desired operation.
Solution: asyncio.Task
According to Python's documentation for asyncio.Task, it allows for the execution of a coroutine "in the background." By using asyncio.ensure_future to spawn a task, the execution is not blocked, and the function returns immediately, similar to the "fire and forget" behavior.
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())
Output:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
Handling Pending Tasks
If tasks are still executing after the event loop has completed, a warning may be displayed. To prevent this, all pending tasks can be awaited once the event loop finishes:
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
Cancelling Tasks
In some cases, it may be necessary to cancel tasks that are not expected to be completed. This can be achieved using 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)
The above is the detailed content of How to Achieve 'Fire and Forget' Behavior in Python 3.5's Async/Await?. For more information, please follow other related articles on the PHP Chinese website!