Skip to content

Multiprocessing in Python

Multiprocessing runs work in multiple processes.

  • Each process has its own Python interpreter and memory space.
  • This can use multiple CPU cores.

In CPython, threads are limited by the GIL for CPU-bound code.

Multiprocessing avoids this because:

  • each process has its own GIL

Best for CPU-bound tasks:

  • heavy number crunching
  • image processing
  • data transformations
  • simulations

For I/O-bound tasks, threading or async may be better.

When using multiprocessing, always guard code with:

main_guard.py
if __name__ == "__main__":
    # start processes here
    pass

This avoids infinite child-process spawning on some platforms.

Unlike threads, which share one interpreter and memory space, each process gets its own — so they run truly in parallel on separate CPU cores with no GIL to fight over:

diagram Each process runs in parallel, in its own memory mermaid
A parent process spawns three child processes, each with its own Python interpreter and memory, running in parallel on separate CPU cores. Data must be sent explicitly (pickled) between them, since nothing is shared.

pch.coffeeTagline

pch.coffeeCta

pch.feedbackHeading

pch.feedbackSubheading