From 71b7abc030f9696b1ac16439cdc7ec50ff639e59 Mon Sep 17 00:00:00 2001 From: Tiago Antao Date: Tue, 2 May 2017 20:27:57 -0600 Subject: [PATCH] bpo-28326: Fixes multiprocessing.Process depends on sys.stdout being open --- Lib/multiprocessing/popen_fork.py | 6 ++++-- Lib/test/test_multiprocessing_main_handling.py | 9 ++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py index d2ebd7cfbe1e03..718728386fd3d0 100644 --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -14,8 +14,10 @@ class Popen(object): method = 'fork' def __init__(self, process_obj): - sys.stdout.flush() - sys.stderr.flush() + if not sys.stdout.closed: + sys.stdout.flush() + if not sys.stderr.closed: + sys.stderr.flush() self.returncode = None self._launch(process_obj) diff --git a/Lib/test/test_multiprocessing_main_handling.py b/Lib/test/test_multiprocessing_main_handling.py index 32593dab86da16..bed9f509096cf5 100644 --- a/Lib/test/test_multiprocessing_main_handling.py +++ b/Lib/test/test_multiprocessing_main_handling.py @@ -38,7 +38,7 @@ import sys import time -from multiprocessing import Pool, set_start_method +from multiprocessing import Pool, Process, set_start_method # We use this __main__ defined function in the map call below in order to # check that multiprocessing in correctly running the unguarded @@ -65,6 +65,13 @@ def f(x): raise RuntimeError("Timed out waiting for results") results.sort() print(start_method, "->", results) + sys.stdout.close() + sys.stderr.close() + process = Process(target=f, args=(1,)) + process.start() + process.join(10) + if process.is_alive(): + raise RuntimeError("Timed out waiting for single process") """ test_source_main_skipped_in_children = """\