mirror of https://github.com/python/cpython
79 lines
1.8 KiB
Python
79 lines
1.8 KiB
Python
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']
|