Python async/await
last modified January 29, 2024
In this article we show how to use async/await keywords in Python.
With asynchronous programming, we can execute tasks concurrently with the main program execution. The async and await keywords simplify asynchronous programming in Python. Python has asynchronous programming model built into the language.
Python coroutine
A coroutine is a Python function used in cooperative multitasking, where they
can be paused and resumed. A coroutine is declared with the
async def syntax.
The async/await keywords
The async/await keywords were standardized in Python 3.7. They
simplify asynchronous programming in Python. The async keyword is
used to create a Python coroutine. The await keyword suspends
execution of a coroutine until it completes and returns the result data.
The await keywords only works within an async function.
Python async/await example I
The following is a simple program which uses async/await keywords.
#!/usr/bin/python
import asyncio
async def mul(x, y):
return x * y
loop = asyncio.get_event_loop()
res = loop.run_until_complete(mul(5, 5))
print(res2)
loop.close()
The program creates and runs an asynchronous function.
async def mul(x, y):
return x * y
A coroutine is a function declared with async modifier.
loop = asyncio.get_event_loop()
The get_event_loop returns an asyncio event loop. An event loop is
needed to execute asynchronous code.
res = loop.run_until_complete(mul(5, 5))
The run_until_complete function runs the event loop until a future
is done. It return the future's result, or raise its exception. A Future
represents an eventual result of an asynchronous operation.
Python async/await example II
With asyncio.run, we simplify the code. The function creates an
event loop, schedules the coroutines and in the end closes the loop.
#!/usr/bin/python
import asyncio
async def add(x, y):
return x + y
async def get_results():
res1 = await add(3, 4)
res2 = await add(8, 5)
print(res1, res2)
asyncio.run(get_results())
In the example, we run two async functions.
$ python simple2.py 7 13
Python async/await example III
Gathering is a convenient way to schedule multiple coroutines to run
concurrently. We gather coroutines with asyncio.gather.
With asyncio.sleep we create a coroutine that finishes in the
specified number of secods. It is often used to simulate a long-running task.
#!/usr/bin/python
import asyncio
import time
import random
async def task1():
wait = random.randint(0, 3)
await asyncio.sleep(wait)
print("task 1 finished")
async def task2():
wait = random.randint(0, 3)
await asyncio.sleep(wait)
print("task 2 finished")
async def task3():
wait = random.randint(0, 3)
await asyncio.sleep(wait)
print("task 3 finished")
async def main():
for x in range(2):
await asyncio.gather(task1(), task2(), task3())
time.sleep(1)
print('----------------------------')
t1 = time.perf_counter()
asyncio.run(main())
t2 = time.perf_counter()
print(f'Total time elapsed: {t2-t1:0.2f} seconds')
We have three tasks that finish in a random number of seconds. This way we simulate execution of three different long-running tasks.
async def main():
for x in range(2):
await asyncio.gather(task1(), task2(), task3())
print('----------------------------')
The main functions gathers all the three tasks. It is also a coroutine,
decorated with async. We await the results of the
asyncio.gather with the await keyword.
$ python simple3.py task 2 finished task 1 finished task 3 finished ---------------------------- task 3 finished task 2 finished task 1 finished ---------------------------- Total time elapsed: 8.01 seconds
Python Playwright async example
Many libraries have support for asynchronous programming. The MS Playwright library allows to automate browsers both in synchronous and asynchronous modes.
#!/usr/bin/python
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as playwright:
webkit = playwright.webkit
browser = await webkit.launch()
page = await browser.new_page()
url = 'http://webcode.me'
await page.goto(url)
await page.screenshot(path='shot.png')
await browser.close()
asyncio.run(main())
In the example, we create a screenshot of a web page with Playwright. We use the async API.
Source
Python asyncio - language reference
In this article we have worked with async/await keywords in Python.
Author
List all Python tutorials.