diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-01-27 09:53:35 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-01-27 09:53:35 (GMT) |
commit | 2d843d25204af3a791f31b1b941675da49be82ed (patch) | |
tree | 8726d48e8a575217c26ea4a0a5ceaf19d9bd70b5 | |
parent | e10ae8871a057d6afb5a4c5650e0ed029f13721d (diff) | |
parent | 84a0fbf6b0c2d196ae3995697acf596094b94eb8 (diff) | |
download | cpython-2d843d25204af3a791f31b1b941675da49be82ed.zip cpython-2d843d25204af3a791f31b1b941675da49be82ed.tar.gz cpython-2d843d25204af3a791f31b1b941675da49be82ed.tar.bz2 |
Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
-rw-r--r-- | Lib/multiprocessing/forking.py | 2 | ||||
-rw-r--r-- | Lib/multiprocessing/process.py | 7 | ||||
-rw-r--r-- | Lib/test/test_multiprocessing.py | 23 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 30 insertions, 5 deletions
diff --git a/Lib/multiprocessing/forking.py b/Lib/multiprocessing/forking.py index 47746cb..b7de567 100644 --- a/Lib/multiprocessing/forking.py +++ b/Lib/multiprocessing/forking.py @@ -129,8 +129,6 @@ if sys.platform != 'win32': import random random.seed() code = process_obj._bootstrap() - sys.stdout.flush() - sys.stderr.flush() os._exit(code) # `w` will be closed when the child exits, at which point `r` diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index 98ce0da..b599f11 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -291,16 +291,17 @@ class Process(object): exitcode = e.args[0] else: sys.stderr.write(e.args[0] + '\n') - sys.stderr.flush() exitcode = 1 except: exitcode = 1 import traceback sys.stderr.write('Process %s:\n' % self.name) - sys.stderr.flush() traceback.print_exc() + finally: + util.info('process exiting with exitcode %d' % exitcode) + sys.stdout.flush() + sys.stderr.flush() - util.info('process exiting with exitcode %d' % exitcode) return exitcode # diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index 93cc11d..e5beb97 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -417,6 +417,29 @@ class _TestSubclassingProcess(BaseTestCase): uppercaser.stop() uppercaser.join() + def test_stderr_flush(self): + # sys.stderr is flushed at process shutdown (issue #13812) + if self.TYPE == "threads": + return + + testfn = test.support.TESTFN + self.addCleanup(test.support.unlink, testfn) + proc = self.Process(target=self._test_stderr_flush, args=(testfn,)) + proc.start() + proc.join() + with open(testfn, 'r') as f: + err = f.read() + # The whole traceback was printed + self.assertIn("ZeroDivisionError", err) + self.assertIn("test_multiprocessing.py", err) + self.assertIn("1/0 # MARKER", err) + + @classmethod + def _test_stderr_flush(cls, testfn): + sys.stderr = open(testfn, 'w') + 1/0 # MARKER + + # # # @@ -461,6 +461,9 @@ Core and Builtins Library ------- +- Issue #13812: When a multiprocessing Process child raises an exception, + flush stderr after printing the exception traceback. + - Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC IV attack countermeasure. |