CPU 바운드
순수 Python 계산total += i * i처럼 Python 바이트코드를 계속 실행하면 스레드가 GIL을 번갈아 잡습니다.
순차 실행
2.10s
2스레드
2.35s
기본 CPython의 GIL은 한 번에 하나의 스레드만 Python 바이트코드를 실행하게 합니다. 하지만 I/O 대기 중에는 GIL이 풀려 다른 스레드가 진행할 수 있습니다.
total += i * i처럼 Python 바이트코드를 계속 실행하면 스레드가 GIL을 번갈아 잡습니다.
time.sleep(), socket.recv()처럼 대기하는 동안 GIL이 풀려 시간이 겹칩니다.
multiprocessing이나 ProcessPoolExecutor로 여러 코어를 사용합니다.
threading, ThreadPoolExecutor가 단순하고 효과적입니다.
연결 수가 많고 작업이 짧다면 async/await도 좋은 선택입니다.