aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2015-11-19 12:59:39 +1000
committerNick Coghlan <ncoghlan@gmail.com>2015-11-19 12:59:39 +1000
commit2a6c2c9baa4bef29d605438c3e2ada01a240bdc3 (patch)
treea9d79b7928fc88f473884ca08207db601559b576
parentIssue #23200: Document that max_length=0 is not supported (diff)
downloadcpython-2a6c2c9baa4bef29d605438c3e2ada01a240bdc3.tar.gz
cpython-2a6c2c9baa4bef29d605438c3e2ada01a240bdc3.tar.bz2
cpython-2a6c2c9baa4bef29d605438c3e2ada01a240bdc3.zip
Close #10128: don't rerun __main__.py in multiprocessing
- backports issue #10845's mitigation of incompatibilities between the multiprocessing module and directory and zipfile execution - Multiprocessing on Windows will now automatically skip rerunning top level __main__.py modules in spawned processes, rather than failing with AssertionError
-rw-r--r--Lib/multiprocessing/forking.py16
-rw-r--r--Misc/NEWS5
2 files changed, 20 insertions, 1 deletions
diff --git a/Lib/multiprocessing/forking.py b/Lib/multiprocessing/forking.py
index 6bddfb74ff5..d393817bb34 100644
--- a/Lib/multiprocessing/forking.py
+++ b/Lib/multiprocessing/forking.py
@@ -470,12 +470,26 @@ def prepare(data):
process.ORIGINAL_DIR = data['orig_dir']
if 'main_path' in data:
+ # XXX (ncoghlan): The following code makes several bogus
+ # assumptions regarding the relationship between __file__
+ # and a module's real name. See PEP 302 and issue #10845
+ # The problem is resolved properly in Python 3.4+, as
+ # described in issue #19946
+
main_path = data['main_path']
main_name = os.path.splitext(os.path.basename(main_path))[0]
if main_name == '__init__':
main_name = os.path.basename(os.path.dirname(main_path))
- if main_name != 'ipython':
+ if main_name == '__main__':
+ # For directory and zipfile execution, we assume an implicit
+ # "if __name__ == '__main__':" around the module, and don't
+ # rerun the main module code in spawned processes
+ main_module = sys.modules['__main__']
+ main_module.__file__ = main_path
+ elif main_name != 'ipython':
+ # Main modules not actually called __main__.py may
+ # contain additional code that should still be executed
import imp
if main_path is None:
diff --git a/Misc/NEWS b/Misc/NEWS
index ec443917c7f..1075daaa408 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -55,6 +55,11 @@ Core and Builtins
Library
-------
+- Issue #10128: backport issue #10845's mitigation of incompatibilities between
+ the multiprocessing module and directory and zipfile execution.
+ Multiprocessing on Windows will now automatically skip rerunning __main__ in
+ spawned processes, rather than failing with AssertionError.
+
- Issue #25578: Fix (another) memory leak in SSLSocket.getpeercer().
- Issue #25590: In the Readline completer, only call getattr() once per