在哪里多处理过程

2024-03-29 12:47:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个正在运行的应用程序从python3.3移植到3.4,遇到了一个奇怪的情况。班级多处理过程在下载中不存在python.org网站. 相反,在多处理.process模块,我找到一个类多处理.process.BaseProcess. 我只能在新的进程类中找到旧进程类的踪迹多处理.context模块,其中多处理.context.Process基本上是BaseProcess的一个覆盖函数。Python3.4的文档中没有提到这些。有谁能告诉我发生了什么事,并可能给我一些文件吗。在


Tags: 模块文件函数文档org应用程序进程网站
2条回答

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

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__

所以它从context._default_context中拉出{}。在

如果您在context.py中查找,可以找到Process类:

^{pr2}$

其中还引用和定义了更具体的实现:

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)外部导入类的人都会看到这些类被破坏。在

如果您使用的是Eclipse和PyDev,则需要将“multiprocessing”作为python解释器的强制内置。在

相关问题 更多 >