2013-06-04 47 views
2

我正在使用簡單線程模塊來執行併發作業。現在我想利用並行期貨模塊。有人可以給我一個使用併發庫的隊列的例子嗎?如何在python 3中使用併發將來的ThreadPoolExecutor隊列?

我得到類型錯誤:「排隊」對象不是可迭代 我不知道如何來遍歷隊列

代碼片段:

def run(item): 
     self.__log.info(str(item)) 
     return True 
<queue filled here> 

with concurrent.futures.ThreadPoolExecutor(max_workers = 100) as executor: 
     furtureIteams = { executor.submit(run, item): item for item in list(queue)} 
     for future in concurrent.futures.as_completed(furtureIteams): 
      f = furtureIteams[future] 
      print(f) 
+0

通常你會用消費者生產者問題的隊列http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem – User

+0

我正在尋找一些示例代碼來讀取隊列使用threadpoolexecutor – user2433024

回答

3

我建議是這樣的:

def run(queue): 
     item = queue.get() 
     self.__log.info(str(item)) 
     return True 
<queue filled here> 
workerThreadsToStart = 10 
with concurrent.futures.ThreadPoolExecutor(max_workers = 100) as executor: 
     furtureIteams = { executor.submit(run, queue): index for intex in range(workerThreadsToStart)} 
     for future in concurrent.futures.as_completed(furtureIteams): 
      f = furtureIteams[future] 
      print(f) 

你將運行的問題是一個隊列被認爲是無止境的,並作爲一個媒介來解耦線程,把東西放入隊列和線程中將項目排除在隊列之外。

  1. 您有一個項目的數量有限或
  2. 你計算所有項目一次

事後並行處理它們,隊列是沒有意義的。 在這些情況下,ThreadPoolExecutor使隊列過時。

我有一看的ThreadPoolExecutor源:

def submit(self, fn, *args, **kwargs): # line 94 
    self._work_queue.put(w) # line 102 

隊列是內部使用。

+2

+1隊列在這裏可能是多餘的。通常,你可以使用雙參數的iter()函數將一個隊列轉換爲一個迭代器:'對於iter中的項目(queue.get,sentinel):#獲取項目直到發現sentinel' – jfs

相關問題