Python — od podstaw do zaawansowanego · Concurrency II — wątki, procesy, GIL
multiprocessing — prawdziwa równoległość
Concurrency II — wątki, procesy, GIL
Wprowadzenie
Moduł multiprocessing daje prawdziwą równoległość CPU w Pythonie omijając GIL — każdy proces ma własny interpreter i własny GIL. Cena: koszt startu procesu, pickling argumentów, IPC zamiast wspólnej pamięci, większy footprint RAM. Wybór między threading a multiprocessing: I/O-bound → threading, CPU-bound → multiprocessing.
API: Process(target, args) analogicznie do Thread, Pool do worker poolu (map, imap, apply_async), Queue i Pipe do IPC, Manager dla współdzielonych struktur (list, dict, Namespace). Start methods: fork (Linux/Mac default <3.14, szybki, copy-on-write), spawn (Windows default, czysty interpreter), forkserver (kompromis).
Pułapki: (1) if __name__ == "__main__": jest WYMAGANE pod spawn, (2) argumenty muszą być picklowalne (lambda, lokalne klasy nie działają), (3) fork po wątkach → undefined behavior, (4) NumPy + fork może hangować z OpenBLAS, (5) IPC overhead — Pool.map z chunksize=1 dla dużych argumentów jest wolny.