我知道python中的Queue.get()
方法是一个阻塞函数。我需要知道我是否在main中实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都将被阻塞。
例如,如果主要包含发射器和接收器的功能,两者是否一起工作?
答案 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