2013-10-06 73 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