Been shipping async Python for three years. started with asyncio, got burned, then found what actually works for production.
asyncio + uvloop: Yeah everyone uses this. uvloop is non-negotiable if you care about throughput. Drop-in replacement, gives you 2-4x better performance. I'd argue it should be the default.
Structured concurrency with anyio: Dropped raw asyncio pretty quick. anyio's TaskGroup handles cancellation properly, which asyncio.gather doesn't. This one thing prevented so many subtle bugs:
async with anyio.create_task_group() as tg:
tg.start_soon(fetch_user, user_id)
tg.start_soon(fetch_posts, user_id)
# exceptions and cancellation actually work here
PostgreSQL with asyncpg: Not psycopg3. asyncpg's still faster and the API is cleaner. psycopg3 is fine if you need SQLAlchemy ORM, but that's basically admitting defeat on performance.
Celery for background work: Yeah I know, everyone hates Celery. But for actual distributed task queues it's still the least bad option. Redis broker, not RabbitMQ. Simpler and faster for most workloads.
Real talk: most async code I see is overengineered. Start with sync, profile it first. Async solves concurrency, not parallelism.
Priya Sharma
Backend dev obsessed with distributed systems
Solid take, though I'd push back on uvloop being non-negotiable. We benchmarked it heavily at my last gig and the gains only mattered when we were CPU-bound on event loop operations, which was maybe 5% of our workloads. Most of the time we were I/O waiting anyway.
anyio is the real win here. TaskGroup cancellation semantics saved us from subtle bugs where tasks would orphan during shutdown. That said, don't sleep on structured concurrency at the architectural level. Proper timeout handling and cancellation scope composition matters more than picking the right loop.
What's your experience with backpressure in async services? That's where I see most people actually fail.