使用 python 和 BaseProcess class 进行多处理
Multiprocessing with python and BaseProcess class
我正在尝试使用 python 在另一个进程中启动一个函数,如下所示:
from multiprocessing.process import BaseProcess
import os
class MyProcess(BaseProcess):
def __init__(self):
self._identity = ()
self._name = 'ProcessController'
self._parent_pid = os.getpid()
self._popen = None
def run(self):
print("Launching foo..." + str(os.getpid()))
Foo()
if __name__ == '__main__':
print("pid : " + str(os.getpid()))
MyProcess().start()
但是我遇到了这个错误:
Traceback (most recent call last): File
"...\Main.py",
line 27, in
MyProcess().start() File "C:\Python34\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self) TypeError: _Popen() takes 1 positional argument but 2 were given
我的目的当然是为 2 "print" 设置 2 个不同的 pid。我找不到如何执行此操作,我没有从多处理中找到进程 class(就像我在 doc 中看到的那样)。我做错了什么?
直接子类化Process
,并且一定要在你自己的__init__
:
中调用它的__init__
from multiprocessing import Process
import os
class MyProcess(Process):
def __init__(self, name='ProcessController'):
super().__init__(name=name)
def run(self):
print("Launching foo..." + str(os.getpid()))
Foo()
if __name__ == '__main__':
print("pid : " + str(os.getpid()))
MyProcess().start()
请注意,我还遗漏了一些您定义的实例变量,这些实例变量也在 BaseProcess
中定义,因为您真的不应该覆盖它们。我还将您的自定义名称传递给 Process.__init__
,因为这是设置它的正确方法,而不是直接设置 self._name
.
很难在源代码中找到 Process
的原因是 multiprocessing
包以一种从 [=28 开始的奇怪方式填充顶级 multiprocessing
模块=] 3.4;它最终来自 multiprocessing.context
:
>>> from multiprocessing import Process
>>> Process
<class 'multiprocessing.context.Process'>
我正在尝试使用 python 在另一个进程中启动一个函数,如下所示:
from multiprocessing.process import BaseProcess
import os
class MyProcess(BaseProcess):
def __init__(self):
self._identity = ()
self._name = 'ProcessController'
self._parent_pid = os.getpid()
self._popen = None
def run(self):
print("Launching foo..." + str(os.getpid()))
Foo()
if __name__ == '__main__':
print("pid : " + str(os.getpid()))
MyProcess().start()
但是我遇到了这个错误:
Traceback (most recent call last): File "...\Main.py", line 27, in MyProcess().start() File "C:\Python34\lib\multiprocessing\process.py", line 105, in start self._popen = self._Popen(self) TypeError: _Popen() takes 1 positional argument but 2 were given
我的目的当然是为 2 "print" 设置 2 个不同的 pid。我找不到如何执行此操作,我没有从多处理中找到进程 class(就像我在 doc 中看到的那样)。我做错了什么?
直接子类化Process
,并且一定要在你自己的__init__
:
__init__
from multiprocessing import Process
import os
class MyProcess(Process):
def __init__(self, name='ProcessController'):
super().__init__(name=name)
def run(self):
print("Launching foo..." + str(os.getpid()))
Foo()
if __name__ == '__main__':
print("pid : " + str(os.getpid()))
MyProcess().start()
请注意,我还遗漏了一些您定义的实例变量,这些实例变量也在 BaseProcess
中定义,因为您真的不应该覆盖它们。我还将您的自定义名称传递给 Process.__init__
,因为这是设置它的正确方法,而不是直接设置 self._name
.
很难在源代码中找到 Process
的原因是 multiprocessing
包以一种从 [=28 开始的奇怪方式填充顶级 multiprocessing
模块=] 3.4;它最终来自 multiprocessing.context
:
>>> from multiprocessing import Process
>>> Process
<class 'multiprocessing.context.Process'>