Python 多处理在哪里
我正在将一个工作应用程序从Python3.3移植到3.4,遇到了一个奇怪的情况。从python.org下载的文件中没有multiprocessing.Process类。相反,在multiprocessing.process模块中,我找到了一个类multiprocessing.process.BaseProcess。我能找到的旧进程类的唯一踪迹是在新的multiprocessing.context模块中,其中multiprocessing.context.Process基本上是BaseProcess的覆盖函数。Python 3.4的文档中没有提到这些。有谁能告诉我发生了什么,并可能给我指出一些文档。它仍然在那里,只是以一种非常不同的方式定义:Python 多处理在哪里,python,multiprocessing,python-3.4,Python,Multiprocessing,Python 3.4,我正在将一个工作应用程序从Python3.3移植到3.4,遇到了一个奇怪的情况。从python.org下载的文件中没有multiprocessing.Process类。相反,在multiprocessing.process模块中,我找到了一个类multiprocessing.process.BaseProcess。我能找到的旧进程类的唯一踪迹是在新的multiprocessing.context模块中,其中multiprocessing.context.Process基本上是BaseProces
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__
因此,它从上下文中提取\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。\u默认值\u上下文
如果在context.py
中查找,可以找到进程
类:
#
# 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'])
默认上下文的\uuuuuuuuuuuuuuuuuuuuuuuu
稍后设置:
DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_')
代码布局中的更改是为了支持。对于大多数人来说,这种更改应该是透明的,但是任何从顶级包外部导入类的人(例如,从多处理中导入类。
。队列导入队列
或从多处理中导入类。。进程导入过程
)都会看到它们发生故障。它仍然存在,它只是以一种非常不同的方式定义:
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__
因此,它从上下文中提取\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。\u默认值\u上下文
如果在context.py
中查找,可以找到进程
类:
#
# 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'])
默认上下文的\uuuuuuuuuuuuuuuuuuuuuuuu
稍后设置:
DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_')
代码布局中的更改是为了支持。对于大多数人来说,此更改应该是透明的,但是任何从顶级包外部导入类的人(例如,从multiprocessing.queues import Queue导入类或从multiprocessing.process导入过程导入类)如果您使用Eclipse和PyDev,则需要将“多处理”作为python解释器的强制内置项。如果您使用Eclipse和PyDev,则需要将“多处理”作为python解释器的强制内置项。它仍然存在-这是duck键入的乐趣。只要它有相同的接口,它们是否更改了实际的具体类就不重要了。文档中谈到了它,但代码中缺少了它。由于使用新的打包需要对代码进行更改,所以不能称之为duck-typing。还有其他未记录的更改。例如,multiprocessing.Queue现在是multiprocessing.queues.Queue。@Jonathan,从API的角度来看,它仍然是
multiprocessing.Queue
;调用q=multiprocessing.Queue()
返回一个Queue
对象。只有当您需要实际的类对象,以便可以对其进行子类化或在其上使用isinstance
或其他东西时,才会出现问题。在这种情况下,我同意3.3和3.4之间的更改是破坏性的。@Jonathan另外,Python 3.4的“新增内容”文档对多处理进行了更改,并链接到追踪器中的两个bug,这两个bug更详细地介绍了什么发生了变化以及为什么发生了变化。提到他们可能应该记录一些已经发生但(显然)从未发生过的对象重构。它仍然存在——这就是duck类型化的乐趣。只要它有相同的接口,它们是否更改了实际的具体类就不重要了。文档中谈到了它,但代码中缺少了它。由于使用新的打包需要对代码进行更改,所以不能称之为duck-typing。还有其他未记录的更改。例如,multiprocessing.Queue现在是multiprocessing.queues.Queue。@Jonathan,从API的角度来看,它仍然是multiprocessing.Queue
;调用q=multiprocessing.Queue()
返回一个Queue
对象。只有当您需要实际的类对象,以便可以对其进行子类化或在其上使用isinstance
或其他东西时,才会出现问题。在这种情况下,我同意3.3和3.4之间的更改是破坏性的。@Jonathan另外,Python 3.4的“新增内容”文档对多处理进行了更改,并链接到追踪器中的两个bug,这两个bug更详细地介绍了什么发生了变化以及为什么发生了变化。提到他们可能应该记录一些发生过但(显然)从未发生过的对象重构。不幸的是,这也破坏了我的开发环境,因为我将Pydev与Eclipse一起使用,Pydev似乎无法处理动态构建的所有对象,并且到处报告导入失败。对我来说,在这种环境中,多处理。进程在编译时不再工作。@Jonathan你说的“在编译时不再工作”是什么意思?您的脚本是否确实无法通过回溯执行?否,多重处理的导入。进程被标记为未由Pydev解析。@Jonathan我明白了。我对Pydev了解不够,无法告诉您是否可以做些什么来解决它。我只能说,multiprocessing.Process
仍然存在,因此您的脚本应该在Pydev
之外仍然可以执行。不幸的是,它也破坏了我的开发环境,因为我将Pydev与Eclipse一起使用,而且Pydev似乎无法处理动态构建的All和到处报告导入失败。对我来说,在这种环境中,多处理。进程在编译时不再工作。@Jonathan你说的“在编译时不再工作”是什么意思?你的剧本是一本书吗