import sys import threading __all__ = ['Popen', 'get_spawning_popen', 'set_spawning_popen', 'assert_spawning'] # # Check that the current thread is spawning a child process # _tls = threading.local() def get_spawning_popen(): return getattr(_tls, 'spawning_popen', None) def set_spawning_popen(popen): _tls.spawning_popen = popen def assert_spawning(obj): if get_spawning_popen() is None: raise RuntimeError( '%s objects should only be shared between processes' ' through inheritance' % type(obj).__name__ ) # # # _Popen = None def Popen(process_obj): if _Popen is None: set_start_method() return _Popen(process_obj) def get_start_method(): if _Popen is None: set_start_method() return _Popen.method def set_start_method(meth=None, *, start_helpers=True): global _Popen try: modname = _method_to_module[meth] __import__(modname) except (KeyError, ImportError): raise ValueError('could not use start method %r' % meth) module = sys.modules[modname] if start_helpers: module.Popen.ensure_helpers_running() _Popen = module.Popen if sys.platform == 'win32': _method_to_module = { None: 'multiprocessing.popen_spawn_win32', 'spawn': 'multiprocessing.popen_spawn_win32', } def get_all_start_methods(): return ['spawn'] else: _method_to_module = { None: 'multiprocessing.popen_fork', 'fork': 'multiprocessing.popen_fork', 'spawn': 'multiprocessing.popen_spawn_posix', 'forkserver': 'multiprocessing.popen_forkserver', } def get_all_start_methods(): from . import reduction if reduction.HAVE_SEND_HANDLE: return ['fork', 'spawn', 'forkserver'] else: return ['fork', 'spawn']