如何在类的__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'
答案 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