我知道Queue.get()
python中的方法是一个阻塞函数。我需要知道如果我在main里面实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都会被阻塞。
例如,如果 main 包含发送器和接收器的功能,这两者会一起工作吗?
我知道Queue.get()
python中的方法是一个阻塞函数。我需要知道如果我在main里面实现了这个函数,等待一个线程设置的对象,这是否意味着所有的main都会被阻塞。
例如,如果 main 包含发送器和接收器的功能,这两者会一起工作吗?
是的——如果你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
是的,它会阻塞主/线程。如果您想在不阻止的情况下获取所有消息,请尝试此操作
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