2010-03-08 89 views
3

以下是我创建的测试用例。为什么每个流程都打印1到5的数字,并且是没有在流程中划分的数字?为什么这个python队列代码处理项目多次?

代码:

#!/usr/bin/python 
from subprocess import * 

from Queue import Queue 
from Queue import Empty 

import multiprocessing 
from multiprocessing import Process 

def main(): 
    r = Runner() 
    r.run() 

class Runner(object): 
    processes = [] 

    def run(self): 
     q = Queue() 
     for t in range(1,6): 
      q.put(t) 

     for pi in range(1,4): 
      p = Process(target=self.runFromQueue, args=(q,)) 
      p.start() 
      self.processes.append(p) 

     for p in self.processes: 
      p.join() 

     print "Finished!" 

    def runFromQueue(self, q): 
     try: 
      while True: 
       number = q.get_nowait() 
       print str(number) 
       q.task_done() 

     except Empty: 
      pass 


if __name__ == "__main__": 
    main() 

输出继电器:

$ ./test_threads.py 
1 
2 
3 
4 
5 
1 
1 
2 
3 
2 
4 
3 
5 
4 
5 
Finished! 

预计输出继电器:

$ ./test_threads.py 
1 
2 
3 
4 
5 
Finished! 

回答

8

队列包不处理知道,它仅适用于线程。下面您的示例中发生的情况:

  1. 创建队列,并与数字
  2. 拨叉4流程填写。这将复制存储内容到每个子流程,包括填充队列
  3. 每个进程清空其队列

你必须使用由多道提供的Queue类的副本。

+0

噢,这就是它。谢谢! – 2010-03-08 12:58:14