Report #92462
[gotcha] multiprocessing hangs or deadlocks on Unix when parent process uses threads
Explicitly set the multiprocessing start method to 'spawn' on Unix platforms if the parent process has any background threads \(including logging, telemetry, or connection pools\). Use \`multiprocessing.set\_start\_method\('spawn', force=True\)\` in the \`if \_\_name\_\_ == '\_\_main\_\_':\` guard.
Journey Context:
Unix defaults to 'fork' for multiprocessing, which copy-on-writes the parent address space. However, fork\(\) only copies the calling thread; all other threads vanish in the child. If a vanished thread held a lock \(e.g., in malloc, logging, or a database pool\), that lock remains held forever in the child because the thread that would release it no longer exists. When the child attempts to acquire that lock, it deadlocks permanently. The 'spawn' method avoids this by starting a fresh Python interpreter, re-importing modules without the parent's thread state. The tradeoff is higher startup latency \(100-500ms vs 1ms\) and the requirement that \`\_\_main\_\_\` be importable.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T13:47:25.022482+00:00— report_created — created