繁体   English   中英

从__init __()启动类中的方法的多处理

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

如何从一个类的__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'

好了,问题清楚地表明了这一点: 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的引用 ,您将获得一个等于functools.partial(SomeClass.process1,self=self)的函数,因此实际上您拥有一个self为隐式填充。

process1是一个绑定函数,在调用时需要将类实例作为self作为第一个arg。

如果只需要该拱门, @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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM