从 __init__() 开始 class 中的方法 multiprocessing.Process

Start multiprocessing.Process of method in class, from __init__()

如何从 class 的 __init__() 中启动 multiprocessing.Process,并针对 class 中的另一个函数? class 本身不应是进程。 __init__() 应引用在 class 中分配的 class 变量,而不是在任何函数内部。

工作代码:

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'

好吧,问题清楚地说明了这一点:multiprocessing 调用它时没有参数,但是您期望有一个:self。在这种情况下,您可以这样解决:

import multiprocessing as mp

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

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

但是,如果 您需要对 self 的引用,除了在您引用 [=11] 的上下文中构造该方法之外别无选择=].毕竟,如果您 获取 self.process1,您 不会获得对 SomeClass.process1 的引用,您获得的函数是等于 functools.partial(SomeClass.process1,self=self),所以你实际上有一个函数,其中 self 被隐式填充。

process1 是一个绑定函数,它需要 class 实例作为 self 被调用时作为第一个参数。

如果您只是想要那个拱门,@property 可以提供帮助。

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()