Marketplace python-async-patterns
Python asyncio patterns for concurrent programming. Triggers on: asyncio, async, await, coroutine, gather, semaphore, TaskGroup, event loop, aiohttp, concurrent.
install
source · Clone the upstream repo
git clone https://github.com/aiskillstore/marketplace
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0xdarkmatter/python-async-patterns" ~/.claude/skills/aiskillstore-marketplace-python-async-patterns && rm -rf "$T"
manifest:
skills/0xdarkmatter/python-async-patterns/SKILL.mdsource content
Python Async Patterns
Asyncio patterns for concurrent Python programming.
Core Concepts
import asyncio # Coroutine (must be awaited) async def fetch(url: str) -> str: async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() # Entry point async def main(): result = await fetch("https://example.com") return result asyncio.run(main())
Pattern 1: Concurrent with gather
async def fetch_all(urls: list[str]) -> list[str]: """Fetch multiple URLs concurrently.""" async with aiohttp.ClientSession() as session: tasks = [fetch_one(session, url) for url in urls] return await asyncio.gather(*tasks, return_exceptions=True)
Pattern 2: Bounded Concurrency
async def fetch_with_limit(urls: list[str], limit: int = 10): """Limit concurrent requests.""" semaphore = asyncio.Semaphore(limit) async def bounded_fetch(url): async with semaphore: return await fetch_one(url) return await asyncio.gather(*[bounded_fetch(url) for url in urls])
Pattern 3: TaskGroup (Python 3.11+)
async def process_items(items): """Structured concurrency with automatic cleanup.""" async with asyncio.TaskGroup() as tg: for item in items: tg.create_task(process_one(item)) # All tasks complete here, or exception raised
Pattern 4: Timeout
async def with_timeout(): try: async with asyncio.timeout(5.0): # Python 3.11+ result = await slow_operation() except asyncio.TimeoutError: result = None return result
Critical Warnings
# WRONG - blocks event loop async def bad(): time.sleep(5) # Never use time.sleep! requests.get(url) # Blocking I/O! # CORRECT async def good(): await asyncio.sleep(5) async with aiohttp.ClientSession() as s: await s.get(url)
# WRONG - orphaned task async def bad(): asyncio.create_task(work()) # May be garbage collected! # CORRECT - keep reference async def good(): task = asyncio.create_task(work()) await task
Quick Reference
| Pattern | Use Case |
|---|---|
| Multiple independent operations |
| Rate limiting, resource constraints |
| Structured concurrency (3.11+) |
| Producer-consumer |
| Timeout wrapper (3.11+) |
| Shared mutable state |
Async Context Manager
from contextlib import asynccontextmanager @asynccontextmanager async def managed_connection(): conn = await create_connection() try: yield conn finally: await conn.close()
Additional Resources
For detailed patterns, load:
- Queue, Lock, producer-consumer./references/concurrency-patterns.md
- HTTP client/server patterns./references/aiohttp-patterns.md
- run_in_executor, thread pools./references/mixing-sync-async.md
- Debug mode, profiling, finding issues./references/debugging-async.md
- Graceful shutdown, health checks, signal handling./references/production-patterns.md
- Retry with backoff, circuit breakers, partial failures./references/error-handling.md
- uvloop, connection pooling, buffer sizing./references/performance.md
Scripts
- Scan code for blocking calls in async functions./scripts/find-blocking-calls.sh
Assets
- Production-ready async app skeleton./assets/async-project-template.py
See Also
Prerequisites:
- Type hints for async functionspython-typing-patterns
Related Skills:
- Async web APIspython-fastapi-patterns
- Async logging and tracingpython-observability-patterns
- Async database accesspython-database-patterns