为什么这个进程间通信有效?

时间:2016-07-29 16:54:25

标签: python process multiprocessing

在Python中,很好地记录了进程之间的对象交换:应该使用队列,管道或池(参见doc)。那么为什么这个超级简单的代码在没有这些通信工具的情况下工作呢?

from multiprocessing import Process
from time import sleep
from random import random

class Child_process(Process):

  def __init__(self):
    super(Child_process,self).__init__()
    self._memory = {'a':1}

  def writeInMemory(self,key,value):
    self._memory[key]=value

  def readFromMemory(self,key):
    return self._memory[key]

  def run(self):
    while True:
      sleep(random())

def main():
  # start up the child process:
  child = Child_process()
  child.daemon=True
  child.start()
  print 'Type Ctrl C to stop'
  while True:
    print "in sub process a = ", child.readFromMemory('a')
    child.writeInMemory('b',random())
    print "in sub process b = ", child.readFromMemory('b')
    sleep(5*random())
  # exiting
  child.terminate()
  child.join()

if __name__ == '__main__':
  main()

结果是

Type Ctrl C to stop
in sub process a =  1
in sub process b =  0.469400505093
in sub process a =  1
in sub process b =  0.43154478374
in sub process a =  1
in sub process b =  0.519863589476

1 个答案:

答案 0 :(得分:0)

那是因为没有进程间通信正在发生。

修改代码以在子进程中打印_memory的值:

def run(self):
    while True:
        print('Memory is', self._memory)
        sleep(random())

你会发现子进程内的内存永远不会改变。

示例输出为:

Type Ctrl C to stop
in sub process a =  1
in sub process b =  0.571476878791
('memory', {'a': 1})
('memory', {'a': 1})
('memory', {'a': 1})
('memory', {'a': 1})
in sub process a =  1
in sub process b =  0.0574249557159
('memory', {'a': 1})
('memory', {'a': 1})

请注意它是如何打印的:

('memory', {'a':1})

而不是说:

('memory', {'a': 1, 'b': 0.0574249557159})

所以发生的事情是你所有的电话都是本地。你正在产生一个什么都不做的子流程,而你却没有与它进行任何通信。生成副本 _memory属性时的子流程,但该属性永远不会被修改,并且主流程中的更改不会影响子流程。

要清楚明了:你基本上是在浪费一个子流程。你在没有使用任何的情况下产生一个,并且在产生它之后你就​​像对待任何其他python对象一样对待你的child