为什么这段代码
import multiprocessing
import time
class Bot(multiprocessing.Process):
def __init__(self):
self.val = 0
multiprocessing.Process.__init__(self)
def setVal(self):
self.val = 99
def run(self):
while True:
print 'IN: ', self.val
time.sleep(2)
if __name__ == '__main__':
bot = Bot()
bot.start()
bot.setVal()
while True:
print 'OUT: ', bot.val
time.sleep(2)
给出以下输出?
OUT: 99
IN: 0
OUT: 99
IN: 0
OUT: 99
IN: 0
OUT: 99
IN: 0
OUT: 99
IN: 0
OUT: 99
IN: 0
...
正如你可能猜到的那样,我希望得到全部 99 个,IN 和 OUT。但我不。为什么?我错过了什么?
最佳答案
一旦你在你的对象上调用了 start()
,该对象内部的东西就在一个单独的进程中运行,并且使用该类的方法与其“通信”并不是真正的最好的办法。您需要做的就是所谓的进程间通信(简称IPC),并且有特殊的机制可以正确地完成它。
对于 Python 的 multiprocessing
模块,有两种进程之间通信的机制:Pipe
和 Queue
。我建议研究一下这些(例如 here )。
要在示例中使用 Pipe
机制,您可以这样做(只是一个快速说明):
class Bot(multiprocessing.Process):
def __init__(self, pipe):
multiprocessing.Process.__init__(self)
self.val = 0
self.ipcPipe = pipe
def run(self):
while True:
newData = self.ipcPipe.recv()
self.val = newData[0]
print 'IN: ', self.val
self.ipcPipe.send([self.val])
time.sleep(2)
if __name__ == '__main__':
parent_conn, child_conn = multiprocessing.Pipe()
bot = Bot(child_conn)
bot.start()
value = 0
while True:
value += 1
parent_conn.send([value])
outVal = parent_conn.recv()
print 'OUT: ', outVal[0]
time.sleep(2)
看看这里做了什么:我们创建了 Pipe
的父“端”和子“端”,并将子端赋予您的对象。然后,您可以在父进程中使用 send()
向对象传递新值,并使用 recv()
获取更新后的值。同样,在您的对象(记住,一个单独的进程)内部,您相反地在管道的另一端使用 send()
和 recv()
与父进程通信。
此外,我建议在进行任何其他初始化之前在类 __init__
方法中调用 Process.__init__(self)
。由于您是从 Process
继承的,因此在您自己的类中执行任何操作之前,最好确保引擎盖下的所有 process-y 内容都已正确初始化。
希望这有帮助。
关于python - 从 multiprocessing.Process 继承的 Python 类的设置值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569175/