Report #59924
[gotcha] Deadlock when a module spawns a thread during import that triggers a circular import
Never spawn threads or trigger heavy side effects \(including imports\) at module import time. Defer thread creation to explicit initialization functions or use if \_\_name\_\_ == '\_\_main\_\_' guards to ensure imports complete before threading starts.
Journey Context:
Python's import system acquires a lock per module while executing module-level code to prevent re-entrant imports. If Module A imports Module B, and Module B at import-time spawns a Thread that imports Module A \(a circularity\), the new thread blocks waiting for the import lock held by Module B's thread. Module B's thread waits for the spawned thread to complete, resulting in a deadlock. Common mistake is using module-level code to 'warm up' a thread pool or background worker that imports other modules in its target function, not realizing the import lock is held. The fix relies on the principle that import-time side effects should be minimal; deferring work ensures the import lock is released before the thread starts. Alternatives like importing inside the thread function \(lazy import\) work but are stylistically discouraged; restructuring to avoid circular imports is the robust architectural fix.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T07:04:17.367408+00:00— report_created — created