2013-10-06 102 views
3

我知道Queue.get() python方法是一個阻塞函數。我需要知道,如果我在main中實現了這個函數,等待一個線程設置的對象,這是否意味着所有的main都會被阻塞。Queue.get阻止主?

例如,如果main包含發射器和接收器的功能,那麼兩者是否會一起工作?

+0

你能顯示一些代碼嗎?問題不清楚(對我)。 –

回答

9

是 - 如果您在線程或main函數中調用some_queue.get(),程序將在此處阻塞,直到某個對象通過隊列。


但是,可以使用隊列,使他們don't block,或使他們有某種超時:

import Queue 

while True: 
    try: 
     data = some_queue.get(False) 
     # If `False`, the program is not blocked. `Queue.Empty` is thrown if 
     # the queue is empty 
    except Queue.Empty: 
     data = None 

    try: 
     data2 = some_queue.get(True, 3) 
     # Waits for 3 seconds, otherwise throws `Queue.Empty` 
    except Queue.Empty: 
     data = None 

可以爲some_queue.put做同樣的 - 要麼做some_queue.put(item, False)用於非阻塞隊列,或用於超時的some_queue.put(item, True, 3)。如果您的隊列有一個大小限制,如果沒有剩餘空間來追加新項目,它將拋出一個Queue.Full異常。

+0

爲了澄清,程序只會阻塞調用'queue.get()'函數的線程,對吧? – velocirabbit

2

是的,它會阻止主/線程。如果你想得到所有消息沒有阻止嘗試這

def get_messages(q): 
    messages = [] 

    while q.qsize(): 
     messages.append(q.get()) 
     # or process message here 

    return messages 

如果消息就像上面的流代碼可能會陷入循環。 避免使用「for循環」並獲得迄今爲止發送的所有消息

def get_messages(q): 
    messages = [] 

    for _ in range(q.qsize()): 
     messages.append(q.get()) 
     # or process message here 

    return messages