dummy_thread modified to have interrupt_main and to behave appropriately when

called.

Added announcement in Misc/NEWS for thread.interrupt_main and mention of
dummy_thread's change.
This commit is contained in:
Brett Cannon 2003-06-13 23:44:35 +00:00
parent 93e8e54924
commit 4e64d78bbb
3 changed files with 28 additions and 1 deletions

View File

@ -17,7 +17,7 @@ __email__ = "brett@python.org"
# Exports only things specified by thread documentation # Exports only things specified by thread documentation
# (skipping obsolete synonyms allocate(), start_new(), exit_thread()) # (skipping obsolete synonyms allocate(), start_new(), exit_thread())
__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', __all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock',
'LockType'] 'interrupt_main', 'LockType']
import traceback as _traceback import traceback as _traceback
@ -36,6 +36,9 @@ def start_new_thread(function, args, kwargs={}):
caught and nothing is done; all other exceptions are printed out caught and nothing is done; all other exceptions are printed out
by using traceback.print_exc(). by using traceback.print_exc().
If the executed function calls interrupt_main the KeyboardInterrupt will be
raised when the function returns.
""" """
if type(args) != type(tuple()): if type(args) != type(tuple()):
raise TypeError("2nd arg must be a tuple") raise TypeError("2nd arg must be a tuple")
@ -47,6 +50,10 @@ def start_new_thread(function, args, kwargs={}):
pass pass
except: except:
_traceback.print_exc() _traceback.print_exc()
if _interrupt:
global _interrupt
_interrupt = False
raise KeyboardInterrupt
def exit(): def exit():
"""Dummy implementation of thread.exit().""" """Dummy implementation of thread.exit()."""
@ -114,3 +121,12 @@ class LockType(object):
def locked(self): def locked(self):
return self.locked_status return self.locked_status
_interrupt = False
def interrupt_main():
"""Set _interrupt flag to True to have start_new_thread raise
KeyboardInterrupt upon exiting."""
global _interrupt
_interrupt = True

View File

@ -102,6 +102,14 @@ class MiscTests(unittest.TestCase):
"_thread.LockType is not an instance of what is " "_thread.LockType is not an instance of what is "
"returned by _thread.allocate_lock()") "returned by _thread.allocate_lock()")
def test_interrupt_main(self):
#Calling start_new_thread with a function that executes interrupt_main
# should raise KeyboardInterrupt upon completion.
def call_interrupt():
_thread.interrupt_main()
self.failUnlessRaises(KeyboardInterrupt, _thread.start_new_thread,
call_interrupt, tuple())
class ThreadTests(unittest.TestCase): class ThreadTests(unittest.TestCase):
"""Test thread creation.""" """Test thread creation."""

View File

@ -55,6 +55,9 @@ Core and builtins
Extension modules Extension modules
----------------- -----------------
- thread.interrupt_main() raises KeyboardInterrupt in the main thread.
dummy_thread has also been modified to try to simulate the behavior.
- array.array.insert() now treats negative indices as being relative - array.array.insert() now treats negative indices as being relative
to the end of the array, just like list.insert() does. (SF bug #739313) to the end of the array, just like list.insert() does. (SF bug #739313)