What does the GIL actually prevent, and how do you decide between threads, processes, and asyncio?
The Python GIL serializes CPython bytecode execution, but threads still help I/O-bound work; choose processes for pure Python CPU work and asyncio for many concurrent waits.