2013-06-21 97 views
12

我有在python這個問題多處理:灌裝隊列和管理蟒蛇

  • 我有網址的隊列,我需要不時檢查時間
  • 如果隊列被填滿我需要在
  • 在隊列中的每個項目必須由一個單一的過程(多處理)

被處理的隊列進行處理的每個項目到目前爲止我設法此「手動」實現這樣的:

while 1: 
     self.updateQueue() 

     while not self.mainUrlQueue.empty(): 
      domain = self.mainUrlQueue.get() 

      # if we didn't launched any process yet, we need to do so 
      if len(self.jobs) < maxprocess: 
       self.startJob(domain) 
       #time.sleep(1) 
      else: 
       # If we already have process started we need to clear the old process in our pool and start new ones 
       jobdone = 0 

       # We circle through each of the process, until we find one free ; only then leave the loop 
       while jobdone == 0: 
        for p in self.jobs : 
         #print "entering loop" 
         # if the process finished 
         if not p.is_alive() and jobdone == 0: 
          #print str(p.pid) + " job dead, starting new one" 
          self.jobs.remove(p) 
          self.startJob(domain) 
          jobdone = 1 

然而,導致噸的問題和錯誤。我想知道我是不是更適合使用Pool過程。什麼是正確的方式來做到這一點?

然而,有很多次我的隊列是空的,它可以通過300項第二填補,所以我也不太清楚怎麼在這裏做的事情。

回答

20

您可以使用queue的阻止功能在啓動時產生多個進程(使用multiprocessing.Pool)並讓它們休眠,直到隊列上的某些數據可用於處理。如果你不熟悉的,你可以嘗試「玩」與簡單的程序:

import multiprocessing 
import os 
import time 

the_queue = multiprocessing.Queue() 


def worker_main(queue): 
    print os.getpid(),"working" 
    while True: 
     item = queue.get(True) 
     print os.getpid(), "got", item 
     time.sleep(1) # simulate a "long" operation 

the_pool = multiprocessing.Pool(3, worker_main,(the_queue,)) 
#       don't forget the coma here^

for i in range(5): 
    the_queue.put("hello") 
    the_queue.put("world") 


time.sleep(10) 

與Python 2.7.3 Linux上測試

這將產生3個進程(除了的父進程)。每個孩子執行worker_main函數。這是一個簡單的循環,在每次迭代中從隊列中獲取新項目。如果沒有準備好處理,工人將會阻止。

在啓動時所有3個進程將休眠,直到隊列與一些數據饋送。當有數據可用時,等待的工作人員中的一位獲得該項目並開始處理該項目。在此之後,它會嘗試從隊列中獲得的其他項目,再次等待如果沒有可用...

+0

這並不在Python 2.7.4在Windows上運行,你需要有如果__name__ =「__main__」一部分,你應該通過the_queue作爲第三個參數爲multiprocessing.Pool功能,否則worker_main沒有收到數據 – jhexp

+0

我也有興趣在如何使這片代碼工作。當我運行它,因爲它是那麼它運行,但它打印什麼,可能是因爲worker_main不接收數據。但是,當我通過the_queue作爲第三個參數時,我得到了TypeError:worker_main()參數後必須是一個序列,而不是隊列 – ziky90

+0

@ ziky90你可能忘了'(queue,)'中的昏迷。我編輯了代碼以添加註釋,指出可能的錯誤來源。 –