簡體   English   中英

哪里是multiprocessing.Process

[英]Where is multiprocessing.Process

我正在將可運行的應用程序從Python 3.3移植到3.4,並遇到了一種奇怪的情況。 從python.org下載的文件中不存在multiprocessing.Process類。 而是在multiprocessing.process模塊​​中,找到一個類multiprocessing.process.BaseProcess。 我可以找到的舊Process類的唯一痕跡是在新的multiprocessing.context模塊中,其中multiprocessing.context.Process本質上是BaseProcess的覆蓋函數。 在Python 3.4的文檔中沒有提及這些。 任何人都可以告訴我發生了什么事,並可能向我指出一些文檔。

如果您使用的是Eclipse和PyDev,則需要將“ multiprocessing”作為python解釋器的強制內置函數。

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

現在, 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__all__

如果查看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] != '_')

代碼布局的更改是為了支持上下文 對於大多數人來說,此更改本來應該是透明的,但是從頂級包外部(例如, from multiprocessing.queues import Queuefrom multiprocessing.process import Process )導入類的任何人都將發現事情破裂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM