繁体   English   中英

Queue.get阻塞主要吗?

[英]Does Queue.get block main?

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

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

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


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

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 - 对非阻塞队列执行some_queue.put(item, False) ,或为超时执行some_queue.put(item, True, 3) 如果您的队列有大小限制,如果没有剩余空间来附加新项目,它将抛出Queue.Full异常。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM