Python 多处理在哪里

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

我正在将一个工作应用程序从Python3.3移植到3.4,遇到了一个奇怪的情况。从python.org下载的文件中没有multiprocessing.Process类。相反,在multiprocessing.process模块中,我找到了一个类multiprocessing.process.BaseProcess。我能找到的旧进程类的唯一踪迹是在新的multiprocessing.context模块中,其中multiprocessing.context.Process基本上是BaseProcess的覆盖函数。Python 3.4的文档中没有提到这些。有谁能告诉我发生了什么,并可能给我指出一些文档。

它仍然在那里,只是以一种非常不同的方式定义:

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你说的“在编译时不再工作”是什么意思?你的剧本是一本书吗