我知道Queue.get()
python方法是一个阻塞函数。我需要知道,如果我在main中实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都会被阻塞。Queue.get阻止主?
例如,如果main包含发射器和接收器的功能,那么两者是否会一起工作?
我知道Queue.get()
python方法是一个阻塞函数。我需要知道,如果我在main中实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都会被阻塞。Queue.get阻止主?
例如,如果main包含发射器和接收器的功能,那么两者是否会一起工作?
是 - 如果您在线程或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
异常。
为了澄清,程序只会阻塞调用'queue.get()'函数的线程,对吧? – velocirabbit
是的,它会阻止主/线程。如果你想得到所有消息没有阻止尝试这
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
你能显示一些代码吗?问题不清楚(对我)。 –