2017-06-01 49 views
1

我現在正在使用Python 2.7中的多處理和隊列,並嘗試用變量p打印出0到7。當使用while作爲選項1中顯示的註釋代碼時,它可以工作。但是,如果使用foriter()(如選項2中所示),則會打印0到7,但程序永遠不會退出循環,而必須手動退出。有關如何修改代碼以使循環在打印後正常退出的任何建議?有iter(),有沒有辦法爲輸入arg p.get設置block=Falsepython循環一個隊列,而不是while

def try_queue(): 
    q = Queue() 
    for i in range(10): 
     q.put(i) 

    p = Queue() 
    for j in iter(q.get,8): 
     p.put(j) 

    # option 1, use while, works. 
    # while not p.empty(): 
    # print(p.get()) 

    # option 2, use iter() 
    for k in iter(p.get, None): # None is the sentinel here 
     print(k) 

try_queue() 

Result of option 1

Result of option 2

+0

我在其他地方嘗試過iter(),它的工作原理。只是不知道如何將它與queue.get()函數結合起來。 –

+0

另外,你確定你想使用一個同步隊列嗎?也許你只是想''deque' –

+0

嘗試'在p:do_stuff(k)'中的k並且它報告'TypeError:'Queue'對象不可迭代。 –

回答

0

你不能輕易實現,由於Queue不支持iterator protocol。原因是Queue被設計成消息傳遞對象而不是容器。

Queue.get方法不能確保Queueactually empty。因此,在編寫邏輯時請記住這一點:這不是打算使用Queue的方式。認爲它更像是線程/進程之間的一種「套接字」。

這裏有兩種方法來實現你想要的。

1)創建支持迭代器協議的IterQueue類。

from Queue import Queue 

class IterQueue(Queue): 
    """Queue supporting iterator protocol.""" 
    def __iter__(self): 
     return self 

    def next(self): 
     if self.empty(): 
      raise StopIteration() 

     return self.get() 

queue = IterQueue() 
for element in queue: 
    print element 

2)將get調用包裝到生成器中。這在技術上隱藏了邏輯中的while循環。

def get_next_element(queue): 
    while not queue.empty(): 
     yield queue.get() 

for element in get_next_element(queue): 
    print element 
+0

謝謝!我嘗試了兩種方法,第一種方法仍然不能自動終止,但第二種方法運行良好! –