.. envvar:: PYTHONTHREADDEBUG
- If set, Python will print threading debug info.
+ If set, Python will print threading debug info into stdout.
Need a :ref:`debug build of Python <debug-build>`.
+ .. deprecated-removed:: 3.10 3.12
+
.. envvar:: PYTHONDUMPREFS
* NPN features like :meth:`ssl.SSLSocket.selected_npn_protocol` and
:meth:`ssl.SSLContext.set_npn_protocols` are replaced by ALPN.
+* The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is
+ deprecated in Python 3.10 and will be removed in Python 3.12. This feature
+ requires a :ref:`debug build of Python <debug-build>`.
+ (Contributed by Victor Stinner in :issue:`44584`.)
+
.. _whatsnew310-removed:
Removed
# on platforms known to behave badly.
platforms_to_skip = ('netbsd5', 'hp-ux11')
+# Is Python built with Py_DEBUG macro defined?
+Py_DEBUG = hasattr(sys, 'gettotalrefcount')
+
def restore_default_excepthook(testcase):
testcase.addCleanup(setattr, threading, 'excepthook', threading.excepthook)
threading.Thread(target=noop).start()
# Thread.join() is not called
+ @unittest.skipUnless(Py_DEBUG, 'need debug build (Py_DEBUG)')
+ def test_debug_deprecation(self):
+ # bpo-44584: The PYTHONTHREADDEBUG environment variable is deprecated
+ rc, out, err = assert_python_ok("-Wdefault", "-c", "pass",
+ PYTHONTHREADDEBUG="1")
+ msg = (b'DeprecationWarning: The threading debug '
+ b'(PYTHONTHREADDEBUG environment variable) '
+ b'is deprecated and will be removed in Python 3.12')
+ self.assertIn(msg, err)
+
class ThreadJoinOnShutdown(BaseTestCase):
--- /dev/null
+The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is
+deprecated in Python 3.10 and will be removed in Python 3.12. This feature
+requires a debug build of Python. Patch by Victor Stinner.
\fB\--with-pydebug\fP build option.
.IP PYTHONTHREADDEBUG
If this environment variable is set, Python will print threading debug info.
+The feature is deprecated in Python 3.10 and will be removed in Python 3.12.
.IP PYTHONDUMPREFS
If this environment variable is set, Python will dump objects and reference
counts still alive after shutting down the interpreter.
static PyStatus
init_interp_main(PyThreadState *tstate)
{
+ extern void _PyThread_debug_deprecation(void);
+
assert(!_PyErr_Occurred(tstate));
PyStatus status;
#endif
}
+ // Warn about PYTHONTHREADDEBUG deprecation
+ _PyThread_debug_deprecation();
+
assert(!_PyErr_Occurred(tstate));
return _PyStatus_OK();
PyThread__init_thread();
}
+void
+_PyThread_debug_deprecation(void)
+{
+#ifdef Py_DEBUG
+ if (thread_debug) {
+ // Flush previous dprintf() logs
+ fflush(stdout);
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "The threading debug (PYTHONTHREADDEBUG environment "
+ "variable) is deprecated and will be removed "
+ "in Python 3.12",
+ 0))
+ {
+ _PyErr_WriteUnraisableMsg("at Python startup", NULL);
+ }
+ }
+#endif
+}
+
#if defined(_POSIX_THREADS)
# define PYTHREAD_NAME "pthread"
# include "thread_pthread.h"