我知道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
你能顯示一些代碼嗎?問題不清楚(對我)。 –