Report #71364
[gotcha] multiprocessing hangs or deadlocks on Linux when parent has background threads
Explicitly set \`multiprocessing.set\_start\_method\('spawn'\)\` at program start \(in \`if \_\_name\_\_ == '\_\_main\_\_':\` block\), or use 'forkserver' on Unix. Never use the default 'fork' method if the parent process has any background threads running \(including those in libraries like NumPy, gRPC, or monitoring agents\).
Journey Context:
On Unix, multiprocessing defaults to \`fork\(\)\`, which copies the entire memory space including lock states. If a thread in the parent holds a lock \(e.g., in the CPython allocator, glibc malloc, or a library like NumPy's BLAS\) at the moment of fork, the child inherits a locked mutex with no thread to release it. Any attempt to allocate memory or use that library in the child deadlocks immediately. This manifests as 'random' hangs in production only on Linux, often when moving from single-process to multi-process architectures. The 'spawn' method avoids this by starting a fresh Python interpreter \(slower but safe\). 'forkserver' forks from a clean server process before threads start. The fix is mandatory explicit start method selection in any threaded application, because the default 'fork' is fundamentally unsafe with threads.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T02:21:38.485709+00:00— report_created — created