多处理在哪里。过程

时间:2014-07-25 00:13:55

标签: python multiprocessing python-3.4

我正在将一个从Python 3.3移植到3.4的工作应用程序,并遇到了一个奇怪的情况。 python.org的下载中没有类multiprocessing.Process。相反,在multiprocessing.process模块​​中,我找到了一个类multiprocessing.process.BaseProcess。我能找到的旧Process类的唯一痕迹是在新的multiprocessing.context模块中,其中multiprocessing.context.Process基本上是BaseProcess的封面函数。 Python 3.4的文档中没有提到这一点。任何人都可以告诉我发生了什么,并可能指出我的一些文件。

2 个答案:

答案 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 Queuefrom multiprocessing.process import Process)都会看到它们发生了变化。