Environment Setup
Setting up your development environment for async programming requires a few specific tools and libraries.
Create a Virtual Environment
Always use a virtual environment for async projects:
python -m venv async_env
source async_env/bin/activate # Windows: async_env\Scripts\activate
Install Essential Packages
Install the core packages you’ll need:
pip install aiohttp aiofiles pytest-asyncio
pip freeze > requirements.txt
Why these packages:
aiohttp
- Replacesrequests
for async HTTP callsaiofiles
- Handles file I/O without blockingpytest-asyncio
- Lets you test async functions
Project Structure
Organize your async project for growth:
my_async_project/
├── src/
│ ├── main.py # Application entry point
│ ├── http_client.py # HTTP operations
│ └── config.py # Configuration
├── tests/
│ └── test_main.py # Tests
└── requirements.txt
Basic Configuration
Create a simple configuration system:
# src/config.py
import os
from dataclasses import dataclass
@dataclass
class Config:
timeout: float = 30.0
max_connections: int = 100
debug: bool = os.getenv('DEBUG', 'False').lower() == 'true'
Simple HTTP Client
Create a reusable HTTP client:
# src/http_client.py
import aiohttp
class AsyncHttpClient:
async def __aenter__(self):
self.session = aiohttp.ClientSession()
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
await self.session.close()
async def get(self, url):
async with self.session.get(url) as response:
return await response.json()
Your First Async Program
Here’s a simple program that demonstrates the power of async programming:
# first_async.py
import asyncio
import time
async def make_coffee(name):
print(f"☕ {name}: Starting to make coffee")
await asyncio.sleep(3) # Coffee takes 3 seconds
print(f"☕ {name}: Coffee ready!")
return f"{name}'s coffee"
async def make_toast(name):
print(f"🍞 {name}: Starting to make toast")
await asyncio.sleep(2) # Toast takes 2 seconds
print(f"🍞 {name}: Toast ready!")
return f"{name}'s toast"
async def make_breakfast():
start_time = time.time()
# Make coffee and toast simultaneously
coffee, toast = await asyncio.gather(
make_coffee("Alice"),
make_toast("Alice")
)
elapsed = time.time() - start_time
print(f"🍽️ Breakfast ready in {elapsed:.1f} seconds!")
asyncio.run(make_breakfast())
What happens when you run this:
- Coffee and toast start at the same time
- Toast finishes after 2 seconds
- Coffee finishes after 3 seconds
- Total time: ~3 seconds (not 5 seconds!)
Testing Your Async Code
Write tests to verify your async functions work correctly:
# tests/test_main.py
import pytest
import asyncio
@pytest.mark.asyncio
async def test_make_coffee():
result = await make_coffee("Test")
assert result == "Test's coffee"
@pytest.mark.asyncio
async def test_concurrent_operations():
start = time.time()
# Run 5 tasks concurrently
tasks = [asyncio.sleep(0.1) for _ in range(5)]
await asyncio.gather(*tasks)
elapsed = time.time() - start
assert elapsed < 0.2 # Should take ~0.1s, not ~0.5s
Run your tests:
pytest tests/
Common Beginner Mistakes
1. Forgetting await
# Wrong - returns a coroutine object
result = async_function()
# Correct - waits for completion
result = await async_function()
2. Using blocking operations
# Wrong - blocks the event loop
import time
time.sleep(1)
# Correct - yields to event loop
await asyncio.sleep(1)
3. Not using async context managers
# Wrong - might not close properly
session = aiohttp.ClientSession()
response = await session.get(url)
# Correct - always closes
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
Next Steps
Now that you have a working async environment, in Part 3 we’ll explore your first async program and see the event loop in action.
Key Takeaways
- Always use virtual environments for async projects
asyncio.run()
is your entry point for async programsawait asyncio.gather()
runs multiple operations concurrently- Use
async with
for proper resource management - Test async code with
pytest-asyncio
The foundation is set - you can now write async programs that run multiple operations simultaneously.