2012-05-29 199 views
2

我想实现一个使用多处理和队列的生产者 - 使用者场景;主进程是生产者和两个子进程,它们使用队列中的数据。这项工作虽然没有什么不寻常的发生,但扭曲的是,我希望能够重新启动工人,以防他们死亡(kill -9 workerpid)。但是,当我杀死一个或两个工人时,即使主进程将数据填入队列中,他们也开始说“队列已空”。Python多处理和多处理。问题

我在这里错过了什么? (使用Python 2.7.3在Ubuntu 12.04)

import sys 
import time 

import multiprocessing 
from Queue import Empty 

workers = [] 
fqueue = multiprocessing.Queue() 

class Worker(multiprocessing.Process): 
    def run(self): 
     queue = self._args[0] 
     print "{0} starting up, queue at: {1}".format(self.pid, queue) 
     while True: 
      try: 
       obj = queue.get(block=True, timeout=1) 
       print "{0}: got from queue: {1}".format(self.pid, obj) 
      except Empty: 
       print "{0}: queue was empty".format(self.pid) 
       continue 
      except IOError, e: 
       print "{0}: got IOError on queue: {1}".format(self.pid, e) 
       return 

if __name__ == "__main__": 
    print "zipper starting up (2 workers)" 
    for _ in range(0, 2): 
     p = Worker(args=(fqueue,)) 
     workers.append(p) 
     p.start() 

    cnt = 0 
    while True: 
     for i in range(0, len(workers)): 
      p = workers[i] 
      if not p.is_alive(): 
       print "main: worker {0} is not alive".format(p.pid) 
       p = Worker(args=(fqueue,)) 
       print "main: restarted worker: {0}".format(p) 
       p.start() 
       workers[i] = p 
     print "main: tick" 
     cnt += 1 
     fqueue.put(cnt) 
     time.sleep(2) 

回答

5

你见过warning in the documentation

警告

如果一个进程正在使用Process.terminate()或os.kill丧生()在尝试使用队列时,队列中的数据可能会损坏。这可能会导致任何其他进程在尝试稍后使用队列时发生异常。

因此,杀死使用队列的进程可能会使整个队列无法使用。

+0

呃...是的,我完全错过了。 Mea culpa。 – Unknown