PYTHON-4147 [v4.6]: Silence noisy thread.start() RuntimeError at shutdown (#1532)

Co-authored-by: Jib <jib.adegunloye@mongodb.com>
This commit is contained in:
Steven Silvester 2024-02-20 14:29:01 -06:00 committed by GitHub
parent 0477b9bc0c
commit d29b2b7cf4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 1 deletions

View File

@ -16,6 +16,7 @@
from __future__ import annotations
import sys
import threading
import time
import weakref
@ -92,7 +93,15 @@ class PeriodicExecutor:
thread.daemon = True
self._thread = weakref.proxy(thread)
_register_executor(self)
thread.start()
# Mitigation to RuntimeError firing when thread starts on shutdown
# https://github.com/python/cpython/issues/114570
try:
thread.start()
except RuntimeError as e:
if "interpreter shutdown" in str(e) or sys.is_finalizing():
self._thread = None
return
raise
def close(self, dummy: Any = None) -> None:
"""Stop. To restart, call open().

View File

@ -16,6 +16,7 @@
from __future__ import annotations
import gc
import subprocess
import sys
from functools import partial
@ -79,6 +80,17 @@ class TestMonitor(IntegrationTest):
for executor in executors:
wait_until(lambda: executor._stopped, f"closed executor: {executor._name}", timeout=5)
def test_no_thread_start_runtime_err_on_shutdown(self):
"""Test we silence noisy runtime errors fired when the MongoClient spawns a new thread
on process shutdown."""
command = [sys.executable, "-c", "from pymongo import MongoClient; c = MongoClient()"]
completed_process: subprocess.CompletedProcess = subprocess.run(
command, capture_output=True
)
self.assertFalse(completed_process.stderr)
self.assertFalse(completed_process.stdout)
if __name__ == "__main__":
unittest.main()