为什么这段代码
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
and Queue
。我建议调查这些(例如here http://docs.python.org/2/library/multiprocessing.html#pipes-and-queues).
要使用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()
and recv()
在管道的另一端与父进程通信。
另外,我建议您致电Process.__init__(self)
在你的班级里__init__
method before进行任何其他初始化。既然你继承自Process
在您自己的类中执行任何操作之前,最好确保引擎盖下的所有进程内容都已正确初始化。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)