Chosen Aspects of Concurrency in Python 3
Av Idego Group

This article explores parallel and concurrent programming concepts in Python 3.4+, distinguishing between concurrent programs with multiple logical threads and parallel programs executing simultaneously across cores.
Processes maintain separate memory spaces and interpreters, while threads share context within a single process. Threads excel at handling I/O operations by allowing other tasks to execute during wait times, though the Global Interpreter Lock (GIL) restricts simultaneous execution of Python bytecode to one thread.
Multiple concurrency approaches exist: the low-level _thread module for direct thread management, the threading module with synchronization mechanisms like locks, and the queue module for safe inter-thread communication. Higher-level solutions include concurrent.futures with thread and process pool executors.
The multiprocessing module handles CPU-bound tasks using separate processes, and external tools like Cython's OpenMP integration offer additional options. For specialized use cases, Parallel Python enables distributed computing across network machines.
Python threads suit I/O-bound work but underperform for CPU-intensive tasks due to the GIL. Process-based solutions bypass this constraint but incur serialization overhead, requiring sufficient computational work to justify the communication costs.