10

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

例如,如果 main 包含发送器和接收器的功能,这两者会一起工作吗?

4

2 回答 2

20

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


但是,可以使用队列使它们不阻塞,或者使它们具有某种超时:

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

于 2013-10-06T07:04:02.537 回答
3

是的,它会阻塞主/线程。如果您想在不阻止的情况下获取所有消息,请尝试此操作

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
于 2016-09-16T05:00:57.257 回答