Threading, multiprocessing, asyncio, coroutines, `async`/`await`, the GIL, and concurrency vs parallelism
Threads are useful for I/O-bound concurrency, multiprocessing is better for CPU-bound parallel work in CPython, and `asyncio` organizes cooperative I/O with coroutines and `async`/`await`.
- GIL limits parallel bytecode execution in threads
- Asyncio is concurrency, not magic parallelism
- Choose the model based on the workload
Threading, multiprocessing, asyncio, coroutines, `async`/`await`, the GIL, and concurrency vs parallelism