diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2015-11-19 12:59:39 +1000 |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2015-11-19 12:59:39 +1000 |
commit | 2a6c2c9baa4bef29d605438c3e2ada01a240bdc3 (patch) | |
tree | a9d79b7928fc88f473884ca08207db601559b576 | |
parent | Issue #23200: Document that max_length=0 is not supported (diff) | |
download | cpython-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.py | 16 | ||||
-rw-r--r-- | Misc/NEWS | 5 |
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 |