我正在将一个从Python 3.3移植到3.4的工作应用程序,并遇到了一个奇怪的情况。 python.org的下载中没有类multiprocessing.Process。相反,在multiprocessing.process模块中,我找到了一个类multiprocessing.process.BaseProcess。我能找到的旧Process类的唯一痕迹是在新的multiprocessing.context模块中,其中multiprocessing.context.Process基本上是BaseProcess的封面函数。 Python 3.4的文档中没有提到这一点。任何人都可以告诉我发生了什么,并可能指出我的一些文件。
答案 0 :(得分:3)
如果你正在使用Eclipse和PyDev,你需要将'multiprocessing'作为python解释器的强制内置函数。
答案 1 :(得分:1)
它仍然存在,它只是以一种非常不同的方式定义:
multiprocessing/__init__.py
现在将属性添加到顶级包中,如下所示:
#
# 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__
所以它从__all__
拉出context._default_context
。
如果您查看context.py
,就可以找到Process
课程:
#
# Type of default context -- underlying context can be set at most once
#
class Process(process.BaseProcess):
_start_method = None
@staticmethod
def _Popen(process_obj):
return _default_context.get_context().Process._Popen(process_obj)
在那里也引用和定义了更具体的实现:
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'])
默认上下文的__all__
稍后设置:
DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_')
代码布局的更改是为了支持contexts。对于大多数人来说,这种变化应该是透明的,但是从顶级软件包之外导入类的任何人(例如from multiprocessing.queues import Queue
或from multiprocessing.process import Process
)都会看到它们发生了变化。