<p>它仍然存在,只是以一种非常不同的方式定义:</p>
<p><code>multiprocessing/__init__.py</code>现在将属性添加到顶级包中,如下所示:</p>
<pre><code>#
# Copy stuff from default context
#
globals().update((name, getattr(context._default_context, name))
for name in context._default_context.__all__)
__all__ = context._default_context.__all__
</code></pre>
<p>所以它从<code>context._default_context</code>中拉出{<cd2>}。在</p>
<p>如果您在<code>context.py</code>中查找,可以找到<code>Process</code>类:</p>
^{pr2}$
<p>其中还引用和定义了更具体的实现:</p>
<pre><code>class ForkProcess(process.BaseProcess):
_start_method = 'fork'
@staticmethod
def _Popen(process_obj):
from .popen_fork import Popen
return Popen(process_obj)
class SpawnProcess(process.BaseProcess):
_start_method = 'spawn'
@staticmethod
def _Popen(process_obj):
from .popen_spawn_posix import Popen
return Popen(process_obj)
class ForkServerProcess(process.BaseProcess):
_start_method = 'forkserver'
@staticmethod
def _Popen(process_obj):
from .popen_forkserver import Popen
return Popen(process_obj)
class ForkContext(BaseContext):
_name = 'fork'
Process = ForkProcess
class SpawnContext(BaseContext):
_name = 'spawn'
Process = SpawnProcess
class ForkServerContext(BaseContext):
_name = 'forkserver'
Process = ForkServerProcess
def _check_available(self):
from . import reduction
if not reduction.HAVE_SEND_HANDLE:
raise ValueError('forkserver start method not available')
_concrete_contexts = {
'fork': ForkContext(),
'spawn': SpawnContext(),
'forkserver': ForkServerContext(),
}
_default_context = DefaultContext(_concrete_contexts['fork'])
</code></pre>
<p>稍后将设置默认上下文的<code>__all__</code>:</p>
<pre><code>DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_')
</code></pre>
<p>代码布局的更改是为了支持<a href="https://docs.python.org/3.4/library/multiprocessing.html#contexts-and-start-methods" rel="nofollow">contexts</a>。对于大多数人来说,这种变化应该是透明的,但是任何从顶级包(例如<code>from multiprocessing.queues import Queue</code>或<code>from multiprocessing.process import Process</code>)外部导入类的人都会看到这些类被破坏。在</p>