Lesson 1: Introduction to Concurrency and Asyncio
Concurrency is the concept of executing multiple tasks in parallel, making better use of available resources. Python's asyncio library enables writing asynchronous, concurrent code using the async/await syntax.
Asyncio is a part of the Python standard library, starting from Python 3.4. It enables efficient handling of multiple IO-bound tasks without the need for threads.
Lesson 2: Async/Await and Coroutine Basics
To create a coroutine, use the async def
keyword before the function definition. You can then call the coroutine using the await
keyword. Here's an example:
import asyncio
async def hello_world():
print("Hello, World!")
async def main():
await hello_world()
asyncio.run(main())
Lesson 3: Asyncio Tasks and Running Coroutines Concurrently
To run coroutines concurrently, you can create tasks. Tasks are asyncio's objects that wrap coroutines and run them concurrently when awaited:
import asyncio
async def hello(name, delay):
await asyncio.sleep(delay)
print(f"Hello, {name}!")
async def main():
task1 = asyncio.create_task(hello("Alice", 1))
task2 = asyncio.create_task(hello("Bob", 2))
await task1
await task2
asyncio.run(main())
Lesson 4: Asyncio Gather and Wait Functions
asyncio.gather
is a high-level function that schedules multiple coroutines concurrently and returns their results as a list.
asyncio.wait
is another high-level function that schedules coroutines concurrently and returns two sets of done and pending tasks:
import asyncio
async def square(x):
await asyncio.sleep(x)
return x * x
async def main():
results = await asyncio.gather(square(1), square(2), square(3))
print(results)
done, pending = await asyncio.wait({square(4), square(5), square(6)})
for task in done:
print(task.result())
asyncio.run(main())
Lesson 5: A Real-World Example with Asyncio
Let's say you want to fetch multiple URLs concurrently using aiohttp, an asynchronous HTTP client for asyncio. Here's an example:
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ['https://httpbin.org/get', 'https://api.github.com', 'https://www.example.com']
tasks = [asyncio.create_task(fetch(url)) for url in urls]
responses = await asyncio.gather(*tasks)
for response in responses:
print(response[:100])
asyncio.run(main())
This course should give you a basic understanding of concurrency and how to implement it using asyncio. To learn more, you can refer to the official asyncio documentation:
- Asyncio documentation: https://docs.python.org/3/library/asyncio.html
- Aiohttp documentation: https://docs.aiohttp.org/en/stable/