Skip to content

Interpreter shutdown can deadlock when a daemon thread holds the warnings lock #159485

Description

@ngoldbaum

Originally reported by @krassowski in #158973.

A daemon thread can be stopped while holding the warnings lock. During interpreter finalization, garbage collection triggers a ResourceWarning, deadlocking the finalizing thread:

import threading
import time
import warnings

ready = threading.Event()
warnings.simplefilter("always", ResourceWarning)

class WarnAtShutdown:
    def __init__(self):
        self.self_ref = self  # Defer __del__ until shutdown GC.

    def __del__(self):
        warnings.warn("late", ResourceWarning)

def showwarning(message, *args, **kwargs):
    if str(message) == "hold":
        ready.set()
        time.sleep(0.1)

warnings.showwarning = showwarning
threading.Thread(
    target=lambda: warnings.warn("hold", ResourceWarning),
    daemon=True,
).start()
assert ready.wait(4)
WarnAtShutdown()

Expected: the process exits normally. Actual: it hangs during interpreter shutdown.

  • CPython versions tested on: 3.14.8, 3.15.0.
  • Operating systems tested on: macOS.

Linked PRs

Activity

  1. self-assigned this
    on Oct 15, 2026
  2. added
    type-bugAn unexpected behavior, bug, or error
    interpreter-core(Objects, Python, Grammar, and Parser dirs)
    3.14bugs and security fixes
    3.15bugs and security fixes
    3.16new features, bugs and security fixes
    on Oct 15, 2026
  3. added a commit that references this issue on Oct 15, 2026
  4. ngoldbaum commented on Oct 16, 2026

    @ngoldbaum
    ContributorAuthor

    I updated the reproducer script in the issue to avoid an unbounded wait (it now just does time.sleep(0.1) like test_threading does). This is more realistic and is fixed by @ZeroIntensity's InterpreterGuard approach. There's no need to guard against waiting forever in a callback like my original reproducer was arguing for. There's still a deadlock even without that and the InterpreterGuard fixes it.

  5. added 2 commits that reference this issue on Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

3.14bugs and security fixes3.15bugs and security fixes3.16new features, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions