Asynchronous Programming
Async/await allows concurrent execution without threading. Perfect for I/O-bound tasks like network requests, file operations, or database queries.
💻 Basic Async Functions
import asyncio
# Define async function with 'async def'
async def fetch_data():
print("Start fetching...")
await asyncio.sleep(2) # Simulate network delay
print("Done fetching!")
return {"data": "value"}
# Run async function
asyncio.run(fetch_data())
# Multiple concurrent tasks
async def task1():
await asyncio.sleep(1)
return "Task 1 done"
async def task2():
await asyncio.sleep(2)
return "Task 2 done"
async def main():
# Run concurrently
results = await asyncio.gather(task1(), task2())
print(results) # ['Task 1 done', 'Task 2 done']
asyncio.run(main())🌐 Real-World Example
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
'https://api.example.com/1',
'https://api.example.com/2',
'https://api.example.com/3',
]
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
# Fetch all URLs concurrently
asyncio.run(main())🎯 Key Takeaways
- async def: Define async function
- await: Wait for async operation
- asyncio.run(): Execute async function
- asyncio.gather(): Run multiple tasks concurrently
- Event loop: Manages async task execution
- Best for: I/O-bound operations
- Not for: CPU-intensive tasks (use multiprocessing)