diff options
author | Richard Oudkerk <shibturn@gmail.com> | 2012-11-15 18:22:23 +0000 |
---|---|---|
committer | Richard Oudkerk <shibturn@gmail.com> | 2012-11-15 18:22:23 +0000 |
commit | 6fb5d7d8f9403eb37155878effa9869c866a15ea (patch) | |
tree | 6ca6c482c59b9ef7d3ad8234ecf5c4043be0d5b7 /Lib/multiprocessing | |
parent | 60aed913ddb0168f45b780fdc4828e68d7875a1e (diff) | |
parent | 97c044c8e77b310f2e06c7b0495773d4d02972f2 (diff) | |
download | cpython-6fb5d7d8f9403eb37155878effa9869c866a15ea.tar.gz |
Issue #16481: Merge
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r-- | Lib/multiprocessing/__init__.py | 7 | ||||
-rw-r--r-- | Lib/multiprocessing/forking.py | 22 | ||||
-rw-r--r-- | Lib/multiprocessing/queues.py | 4 |
3 files changed, 17 insertions, 16 deletions
diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py index 1f3e67c9b8..efad532be1 100644 --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -40,6 +40,13 @@ from multiprocessing.process import Process, current_process, active_children from multiprocessing.util import SUBDEBUG, SUBWARNING # +# Alias for main module -- will be reset by bootstrapping child processes +# + +if '__main__' in sys.modules: + sys.modules['__mp_main__'] = sys.modules['__main__'] + +# # Exceptions # diff --git a/Lib/multiprocessing/forking.py b/Lib/multiprocessing/forking.py index c5501a2f75..a0b3d68f9f 100644 --- a/Lib/multiprocessing/forking.py +++ b/Lib/multiprocessing/forking.py @@ -442,27 +442,17 @@ def prepare(data): dirs = [os.path.dirname(main_path)] assert main_name not in sys.modules, main_name + sys.modules.pop('__mp_main__', None) file, path_name, etc = imp.find_module(main_name, dirs) try: - # We would like to do "imp.load_module('__main__', ...)" - # here. However, that would cause 'if __name__ == - # "__main__"' clauses to be executed. + # We should not do 'imp.load_module("__main__", ...)' + # since that would execute 'if __name__ == "__main__"' + # clauses, potentially causing a psuedo fork bomb. main_module = imp.load_module( - '__parents_main__', file, path_name, etc + '__mp_main__', file, path_name, etc ) finally: if file: file.close() - sys.modules['__main__'] = main_module - main_module.__name__ = '__main__' - - # Try to make the potentially picklable objects in - # sys.modules['__main__'] realize they are in the main - # module -- somewhat ugly. - for obj in list(main_module.__dict__.values()): - try: - if obj.__module__ == '__parents_main__': - obj.__module__ = '__main__' - except Exception: - pass + sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 37271fb4eb..f6f02b6665 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -243,10 +243,14 @@ class Queue(object): if wacquire is None: send(obj) + # Delete references to object. See issue16284 + del obj else: wacquire() try: send(obj) + # Delete references to object. See issue16284 + del obj finally: wrelease() except IndexError: |