In CPython, the Global Interpreter Lock allows only one thread to execute Python bytecode at a time.
This makes Multithreading inefficient for CPU-bound tasks, but still useful for I/O-bound tasks.
Multiprocessing avoids this limitation entirely by running each process with its own interpreter and GIL.