2010-03-08 75 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