Queue.get阻塞主要吗?

时间:2013-10-06 06:35:29

标签: python

我知道python中的Queue.get()方法是一个阻塞函数。我需要知道我是否在main中实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都将被阻塞。

例如,如果主要包含发射器和接收器的功能,两者是否一起工作?

2 个答案:

答案 0 :(得分:12)

是 - 如果在线程或some_queue.get()函数内调用main,程序将阻塞那里直到某个对象通过队列。


但是,可以使用队列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异常。

答案 1 :(得分:2)

是的,它会阻止主/线程。如果你想在不阻止的情况下获取所有消息,请尝试使用

def get_messages(q):
    messages = []

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

    return messages

如果消息类似于上面的代码,则代码可能会陷入循环中。 避免使用“for loop”并获取到目前为止发送的所有消息

def get_messages(q):
    messages = []

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

    return messages