从__init __()开始多处理。类中方法的进程

时间:2017-03-07 15:11:28

标签: python python-multiprocessing

如何在类的__init__()内启动multiprocessing.Process,以该类中的另一个函数为目标?班级本身不应该是一个过程。 __init__()应引用类中指定的类变量,而不是任何函数内部。

工作代码:

import multiprocessing as mp
class SomeClass:
    def __init__(self):
        p_process1 = mp.Process(target=self.process1)
        p_process1.start()

    def process1(self):
        while True:
            pass

我想要的代码:

import multiprocessing as mp
class SomeClass:
    def __init__(self):
        self.p_process1.start()

    def process1(self):
        while True:
            pass
    p_process1 = mp.Process(target=process1)

如果我现在尝试运行我想要的代码,我会收到一条错误消息:

Process Process-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
TypeError: process1() missing 1 required positional argument: 'self'

2 个答案:

答案 0 :(得分:2)

问题清楚地说明了问题:multiprocessing 在没有参数的情况下调用它,然而您需要一个:self 。在这种情况下,你可以解决它:

import multiprocessing as mp

class SomeClass:
    def __init__(self):
        self.p_process1.start()

    @staticmethod
    def process1(): # so no parameter
        while True:
            pass
    p_process1 = mp.Process(target=process1)

但是,如果需要对self 的引用,除了在您引用self的上下文中构造方法之外别无选择。毕竟,如果您提取self.process1 未获得对SomeClass.process1 的引用,您将获得等于{{1}的函数所以你实际上有一个隐含地填充functools.partial(SomeClass.process1,self=self)的函数。

答案 1 :(得分:1)

self是一个绑定函数,它需要类实例@property作为被调用时的第一个arg。

如果你只想要那个拱门,import multiprocessing as mp class SomeClass: def __init__(self): self.p_process1.start() def process1(self): while True: pass @property def p_process1(self): return mp.Process(target=self.process1) SomeClass() 可以提供帮助。

id | name
 1 | apples
 2 | pears
 3 | bananas