import osimport sysimport threadingfrom . import processfrom . import reduction__all__ = ()## Exceptions#class ProcessError(Exception):passclass BufferTooShort(ProcessError):passclass TimeoutError(ProcessError):passclass AuthenticationError(ProcessError):pass## Base type for contexts. Bound methods of an instance of this type are included in __all__ of __init__.py#class BaseContext(object):ProcessError = ProcessErrorBufferTooShort = BufferTooShortTimeoutError = TimeoutErrorAuthenticationError = AuthenticationErrorcurrent_process = staticmethod(process.current_process)parent_process = staticmethod(process.parent_process)active_children = staticmethod(process.active_children)def cpu_count(self):'''Returns the number of CPUs in the system'''num = os.cpu_count()if num is None:raise NotImplementedError('cannot determine number of cpus')else:return numdef Manager(self):'''Returns a manager associated with a running server processThe managers methods such as `Lock()`, `Condition()` and `Queue()`can be used to create shared objects.'''from .managers import SyncManagerm = SyncManager(ctx=self.get_context())m.start()return mdef Pipe(self, duplex=True):'''Returns two connection object connected by a pipe'''from .connection import Pipereturn Pipe(duplex)def Lock(self):'''Returns a non-recursive lock object'''from .synchronize import Lockreturn Lock(ctx=self.get_context())def RLock(self):'''Returns a recursive lock object'''from .synchronize import RLockreturn RLock(ctx=self.get_context())def Condition(self, lock=None):'''Returns a condition object'''from .synchronize import Conditionreturn Condition(lock, ctx=self.get_context())def Semaphore(self, value=1):'''Returns a semaphore object'''from .synchronize import Semaphorereturn Semaphore(value, ctx=self.get_context())def BoundedSemaphore(self, value=1):'''Returns a bounded semaphore object'''from .synchronize import BoundedSemaphorereturn BoundedSemaphore(value, ctx=self.get_context())def Event(self):'''Returns an event object'''from .synchronize import Eventreturn Event(ctx=self.get_context())def Barrier(self, parties, action=None, timeout=None):'''Returns a barrier object'''from .synchronize import Barrierreturn Barrier(parties, action, timeout, ctx=self.get_context())def Queue(self, maxsize=0):'''Returns a queue object'''from .queues import Queuereturn Queue(maxsize, ctx=self.get_context())def JoinableQueue(self, maxsize=0):'''Returns a queue object'''from .queues import JoinableQueuereturn JoinableQueue(maxsize, ctx=self.get_context())def SimpleQueue(self):'''Returns a queue object'''from .queues import SimpleQueuereturn SimpleQueue(ctx=self.get_context())def Pool(self, processes=None, initializer=None, initargs=(),maxtasksperchild=None):'''Returns a process pool object'''from .pool import Poolreturn Pool(processes, initializer, initargs, maxtasksperchild,context=self.get_context())def RawValue(self, typecode_or_type, *args):'''Returns a shared object'''from .sharedctypes import RawValuereturn RawValue(typecode_or_type, *args)def RawArray(self, typecode_or_type, size_or_initializer):'''Returns a shared array'''from .sharedctypes import RawArrayreturn RawArray(typecode_or_type, size_or_initializer)def Value(self, typecode_or_type, *args, lock=True):'''Returns a synchronized shared object'''from .sharedctypes import Valuereturn Value(typecode_or_type, *args, lock=lock,ctx=self.get_context())def Array(self, typecode_or_type, size_or_initializer, *, lock=True):'''Returns a synchronized shared array'''from .sharedctypes import Arrayreturn Array(typecode_or_type, size_or_initializer, lock=lock,ctx=self.get_context())def freeze_support(self):'''Check whether this is a fake forked process in a frozen executable.If so then run code specified by commandline and exit.'''if sys.platform == 'win32' and getattr(sys, 'frozen', False):from .spawn import freeze_supportfreeze_support()def get_logger(self):'''Return package logger -- if it does not already exist thenit is created.'''from .util import get_loggerreturn get_logger()def log_to_stderr(self, level=None):'''Turn on logging and add a handler which prints to stderr'''from .util import log_to_stderrreturn log_to_stderr(level)def allow_connection_pickling(self):'''Install support for sending connections and socketsbetween processes'''# This is undocumented. In previous versions of multiprocessing# its only effect was to make socket objects inheritable on Windows.from . import connectiondef set_executable(self, executable):'''Sets the path to a python.exe or pythonw.exe binary used to runchild processes instead of sys.executable when using the 'spawn'start method. Useful for people embedding Python.'''from .spawn import set_executableset_executable(executable)def set_forkserver_preload(self, module_names):'''Set list of module names to try to load in forkserver process.This is really just a hint.'''from .forkserver import set_forkserver_preloadset_forkserver_preload(module_names)def get_context(self, method=None):if method is None:return selftry:ctx = _concrete_contexts[method]except KeyError:raise ValueError('cannot find context for %r' % method) from Nonectx._check_available()return ctxdef get_start_method(self, allow_none=False):return self._namedef set_start_method(self, method, force=False):raise ValueError('cannot set start method of concrete context')@propertydef reducer(self):'''Controls how objects will be reduced to a form that can beshared with other processes.'''return globals().get('reduction')@reducer.setterdef reducer(self, reduction):globals()['reduction'] = reductiondef _check_available(self):pass## Type of default context -- underlying context can be set at most once#class Process(process.BaseProcess):_start_method = None@staticmethoddef _Popen(process_obj):return _default_context.get_context().Process._Popen(process_obj)class DefaultContext(BaseContext):Process = Processdef __init__(self, context):self._default_context = contextself._actual_context = Nonedef get_context(self, method=None):if method is None:if self._actual_context is None:self._actual_context = self._default_contextreturn self._actual_contextelse:return super().get_context(method)def set_start_method(self, method, force=False):if self._actual_context is not None and not force:raise RuntimeError('context has already been set')if method is None and force:self._actual_context = Nonereturnself._actual_context = self.get_context(method)def get_start_method(self, allow_none=False):if self._actual_context is None:if allow_none:return Noneself._actual_context = self._default_contextreturn self._actual_context._namedef get_all_start_methods(self):if sys.platform == 'win32':return ['spawn']else:if reduction.HAVE_SEND_HANDLE:return ['fork', 'spawn', 'forkserver']else:return ['fork', 'spawn']## Context types for fixed start method#if sys.platform != 'win32':class ForkProcess(process.BaseProcess):_start_method = 'fork'@staticmethoddef _Popen(process_obj):from .popen_fork import Popenreturn Popen(process_obj)class SpawnProcess(process.BaseProcess):_start_method = 'spawn'@staticmethoddef _Popen(process_obj):from .popen_spawn_posix import Popenreturn Popen(process_obj)class ForkServerProcess(process.BaseProcess):_start_method = 'forkserver'@staticmethoddef _Popen(process_obj):from .popen_forkserver import Popenreturn Popen(process_obj)class ForkContext(BaseContext):_name = 'fork'Process = ForkProcessclass SpawnContext(BaseContext):_name = 'spawn'Process = SpawnProcessclass ForkServerContext(BaseContext):_name = 'forkserver'Process = ForkServerProcessdef _check_available(self):if not reduction.HAVE_SEND_HANDLE:raise ValueError('forkserver start method not available')_concrete_contexts = {'fork': ForkContext(),'spawn': SpawnContext(),'forkserver': ForkServerContext(),}if sys.platform == 'darwin':# bpo-33725: running arbitrary code after fork() is no longer reliable# on macOS since macOS 10.14 (Mojave). Use spawn by default instead._default_context = DefaultContext(_concrete_contexts['spawn'])else:_default_context = DefaultContext(_concrete_contexts['fork'])else:class SpawnProcess(process.BaseProcess):_start_method = 'spawn'@staticmethoddef _Popen(process_obj):from .popen_spawn_win32 import Popenreturn Popen(process_obj)class SpawnContext(BaseContext):_name = 'spawn'Process = SpawnProcess_concrete_contexts = {'spawn': SpawnContext(),}_default_context = DefaultContext(_concrete_contexts['spawn'])## Force the start method#def _force_start_method(method):_default_context._actual_context = _concrete_contexts[method]## 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 = popendef assert_spawning(obj):if get_spawning_popen() is None:raise RuntimeError('%s objects should only be shared between processes'' through inheritance' % type(obj).__name__)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。