Async Programming in Python: Complete Guide to asyncio

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

What Is Async Programming in Python

Async programming is a coding approach where tasks run concurrently or wait for events without blocking the main execution thread. In modern development, efficient resource and time management is crucial for building high-performance applications.

Async programming lets you:

  • Speed up task execution
  • Improve program responsiveness
  • Use system resources efficiently

Key Benefits of Asynchronous Code

Where It Shines

Async programming is especially useful for I/O-bound operations:

  • File handling
  • Network requests (HTTP APIs)
  • Database interactions
  • WebSocket processing
  • Large-scale data parsing

Async vs. Multithreading

Unlike multithreading, async doesn't require creating extra threads or processes. This reduces system overhead and avoids issues with locks and data synchronization between threads.

How Async Works in Python

Python offers built-in async support through the asyncio module, officially added to the standard library in version 3.4.

Core Concepts

  • async def — defines an async function (coroutine)
  • await — pauses execution until a coroutine completes
  • asyncio — the standard module for managing async tasks
  • event loop — the core loop that schedules and runs coroutines

Basic Async Function Example

import asyncio

async def greet():
    print("Hello!")
    await asyncio.sleep(1)
    print("1 second has passed")

asyncio.run(greet())

Here, await asyncio.sleep(1) simulates waiting for a resource-intensive operation, like a network request.

Creating and Using Async Functions

Defining an Async Function

To create an async function, use the async keyword before the function definition:

async def fetch_data():
    print("Requesting data...")
    await asyncio.sleep(2)
    print("Data received")

Calling an Async Function

Call an async function using asyncio.run():

asyncio.run(fetch_data())

Running Multiple Tasks Concurrently

Using asyncio.gather()

To run multiple coroutines in parallel, use asyncio.gather():

async def task(name, delay):
    print(f"Starting task {name}")
    await asyncio.sleep(delay)
    print(f"Task {name} completed")

async def main():
    await asyncio.gather(
        task("A", 2),
        task("B", 1),
        task("C", 3)
    )

asyncio.run(main())

Alternative Ways to Run Tasks

Besides asyncio.gather(), you can use:

  • asyncio.create_task() — to create individual tasks
  • asyncio.wait() — to wait for tasks with additional options
  • asyncio.as_completed() — to get results as they become available

Async Iterators and Generators

Creating an Async Iterator

To process data streams asynchronously, use async iterators:

class AsyncCounter:
    def __init__(self, max_count):
        self.max_count = max_count
        s                

Blogs

Book Recommendations