[英]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 Queue
或from multiprocessing.process import Process
)導入類的任何人都將發現事情破裂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.