Home >Backend Development >Python Tutorial >How to Achieve 'Fire and Forget' Behavior in Python 3.5's Async/Await?

How to Achieve 'Fire and Forget' Behavior in Python 3.5's Async/Await?

DDD
DDDOriginal
2024-11-08 21:52:01501browse

How to Achieve

"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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn