bpo-42251: Add gettrace and getprofile to threading (GH-23125)
This allows to retrieve the functions that were set in these two, which might differ from sys.gettrace and sys.getprofile within a thread.
This commit is contained in:
parent
db6434c474
commit
0001a1b69e
|
@ -121,6 +121,17 @@ This module defines the following functions:
|
||||||
:meth:`~Thread.run` method is called.
|
:meth:`~Thread.run` method is called.
|
||||||
|
|
||||||
|
|
||||||
|
.. function:: gettrace()
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
single: trace function
|
||||||
|
single: debugger
|
||||||
|
|
||||||
|
Get the trace function as set by :func:`settrace`.
|
||||||
|
|
||||||
|
.. versionadded:: 3.10
|
||||||
|
|
||||||
|
|
||||||
.. function:: setprofile(func)
|
.. function:: setprofile(func)
|
||||||
|
|
||||||
.. index:: single: profile function
|
.. index:: single: profile function
|
||||||
|
@ -130,6 +141,15 @@ This module defines the following functions:
|
||||||
:meth:`~Thread.run` method is called.
|
:meth:`~Thread.run` method is called.
|
||||||
|
|
||||||
|
|
||||||
|
.. function:: getprofile()
|
||||||
|
|
||||||
|
.. index:: single: profile function
|
||||||
|
|
||||||
|
Get the profiler function as set by :func:`setprofile`.
|
||||||
|
|
||||||
|
.. versionadded:: 3.10
|
||||||
|
|
||||||
|
|
||||||
.. function:: stack_size([size])
|
.. function:: stack_size([size])
|
||||||
|
|
||||||
Return the thread stack size used when creating new threads. The optional
|
Return the thread stack size used when creating new threads. The optional
|
||||||
|
|
|
@ -224,6 +224,14 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line
|
||||||
arguments passed to the Python executable.
|
arguments passed to the Python executable.
|
||||||
(Contributed by Victor Stinner in :issue:`23427`.)
|
(Contributed by Victor Stinner in :issue:`23427`.)
|
||||||
|
|
||||||
|
threading
|
||||||
|
---------
|
||||||
|
|
||||||
|
Added :func:`threading.gettrace` and :func:`threading.getprofile` to
|
||||||
|
retrieve the functions set by :func:`threading.settrace` and
|
||||||
|
:func:`threading.setprofile` respectively.
|
||||||
|
(Contributed by Mario Corchero in :issue:`42251`.)
|
||||||
|
|
||||||
types
|
types
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
|
@ -765,6 +765,27 @@ class ThreadTests(BaseTestCase):
|
||||||
finally:
|
finally:
|
||||||
sys.settrace(old_trace)
|
sys.settrace(old_trace)
|
||||||
|
|
||||||
|
def test_gettrace(self):
|
||||||
|
def noop_trace(frame, event, arg):
|
||||||
|
# no operation
|
||||||
|
return noop_trace
|
||||||
|
old_trace = threading.gettrace()
|
||||||
|
try:
|
||||||
|
threading.settrace(noop_trace)
|
||||||
|
trace_func = threading.gettrace()
|
||||||
|
self.assertEqual(noop_trace,trace_func)
|
||||||
|
finally:
|
||||||
|
threading.settrace(old_trace)
|
||||||
|
|
||||||
|
def test_getprofile(self):
|
||||||
|
def fn(*args): pass
|
||||||
|
old_profile = threading.getprofile()
|
||||||
|
try:
|
||||||
|
threading.setprofile(fn)
|
||||||
|
self.assertEqual(fn, threading.getprofile())
|
||||||
|
finally:
|
||||||
|
threading.setprofile(old_profile)
|
||||||
|
|
||||||
@cpython_only
|
@cpython_only
|
||||||
def test_shutdown_locks(self):
|
def test_shutdown_locks(self):
|
||||||
for daemon in (False, True):
|
for daemon in (False, True):
|
||||||
|
|
|
@ -28,7 +28,7 @@ __all__ = ['get_ident', 'active_count', 'Condition', 'current_thread',
|
||||||
'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
|
'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
|
||||||
'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError',
|
'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError',
|
||||||
'setprofile', 'settrace', 'local', 'stack_size',
|
'setprofile', 'settrace', 'local', 'stack_size',
|
||||||
'excepthook', 'ExceptHookArgs']
|
'excepthook', 'ExceptHookArgs', 'gettrace', 'getprofile']
|
||||||
|
|
||||||
# Rename some stuff so "from threading import *" is safe
|
# Rename some stuff so "from threading import *" is safe
|
||||||
_start_new_thread = _thread.start_new_thread
|
_start_new_thread = _thread.start_new_thread
|
||||||
|
@ -65,6 +65,10 @@ def setprofile(func):
|
||||||
global _profile_hook
|
global _profile_hook
|
||||||
_profile_hook = func
|
_profile_hook = func
|
||||||
|
|
||||||
|
def getprofile():
|
||||||
|
"""Get the profiler function as set by threading.setprofile()."""
|
||||||
|
return _profile_hook
|
||||||
|
|
||||||
def settrace(func):
|
def settrace(func):
|
||||||
"""Set a trace function for all threads started from the threading module.
|
"""Set a trace function for all threads started from the threading module.
|
||||||
|
|
||||||
|
@ -75,6 +79,10 @@ def settrace(func):
|
||||||
global _trace_hook
|
global _trace_hook
|
||||||
_trace_hook = func
|
_trace_hook = func
|
||||||
|
|
||||||
|
def gettrace():
|
||||||
|
"""Get the trace function as set by threading.settrace()."""
|
||||||
|
return _trace_hook
|
||||||
|
|
||||||
# Synchronization classes
|
# Synchronization classes
|
||||||
|
|
||||||
Lock = _allocate_lock
|
Lock = _allocate_lock
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Added :func:`threading.gettrace` and :func:`threading.getprofile` to
|
||||||
|
retrieve the functions set by :func:`threading.settrace` and
|
||||||
|
:func:`threading.setprofile` respectively. Patch by Mario Corchero.
|
Loading…
Reference in New Issue