使用python和BaseProcess类进行多处理

时间:2015-04-19 14:53:28

标签: python python-3.4

我正在尝试使用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(最近一次调用最后一次):文件   “... \ Main.py”   第27行,在       MyProcess()。start()文件“C:\ Python34 \ lib \ multiprocessing \ process.py”,第105行,开头       self._popen = self._Popen(self)TypeError:_Popen()需要1个位置参数但是2个被赋予

我的目的当然是为2“打印”提供2个不同的pids。我找不到如何做到这一点,我没有从多处理中找到Process类(就像我在doc中看到的那样)。我做错了什么?

1 个答案:

答案 0 :(得分:4)

直接将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包从Python 3.4开始以奇怪的方式填充顶级multiprocessing模块;它最终来自multiprocessing.context

>>> from multiprocessing import Process
>>> Process
<class 'multiprocessing.context.Process'>