确保可以由多个线程填充的 python 队列将始终在不进行轮询的情况下被清除
Ensuring a python queue that can be populated by multiple threads will always be cleared without polling
我有下面的代码,它显示了即使有多个线程添加到队列中,队列也总是会被清除。它使用递归,但 while 循环也可以工作。这是一种不好的做法,还是会出现队列可能有一个对象并且在将某些内容添加到队列之前不会被拉出的情况。
这样做的主要目的是拥有一个队列来确保执行顺序,而无需使用 q.get()
持续轮询或阻塞
import queue
import threading
lock = threading.RLock()
q = queue.Queue()
def execute():
with lock:
if not q.empty():
text = q.get()
print(text)
execute()
def add_to_queue(text):
q.put(text)
execute()
# Assume multiple threads can call add to queue
add_to_queue("Hello")
这是一种在 .get 函数上使用超时的解决方案,一种是推送到队列,另一种是从队列中读取。您可以有多个读者和作者。
import queue
import threading
q = queue.Queue()
def read():
try:
while True:
text = q.get(timeout=1)
print(text)
except queue.Empty:
print("exiting")
def write():
q.put("Hello")
q.put("There")
q.put("My")
q.put("Friend")
writer = threading.Thread(target=write)
reader = threading.Thread(target=read)
writer.start()
reader.start()
reader.join()
我有下面的代码,它显示了即使有多个线程添加到队列中,队列也总是会被清除。它使用递归,但 while 循环也可以工作。这是一种不好的做法,还是会出现队列可能有一个对象并且在将某些内容添加到队列之前不会被拉出的情况。
这样做的主要目的是拥有一个队列来确保执行顺序,而无需使用 q.get()
持续轮询或阻塞import queue
import threading
lock = threading.RLock()
q = queue.Queue()
def execute():
with lock:
if not q.empty():
text = q.get()
print(text)
execute()
def add_to_queue(text):
q.put(text)
execute()
# Assume multiple threads can call add to queue
add_to_queue("Hello")
这是一种在 .get 函数上使用超时的解决方案,一种是推送到队列,另一种是从队列中读取。您可以有多个读者和作者。
import queue
import threading
q = queue.Queue()
def read():
try:
while True:
text = q.get(timeout=1)
print(text)
except queue.Empty:
print("exiting")
def write():
q.put("Hello")
q.put("There")
q.put("My")
q.put("Friend")
writer = threading.Thread(target=write)
reader = threading.Thread(target=read)
writer.start()
reader.start()
reader.join()