我是 Python 新手,在使用queue.Queue 管理生产者和消费者线程之间的任务的多线程 Python 应用程序中偶尔会遇到停滞问题。有时,应用程序会停止响应。当新项目添加到队列时,生产者会通知消费者,而消费者会等待收到此通知后再访问该项目。
这是我的代码的简化版本:
import threading
import queue
q = queue.Queue()
def producer():
for i in range(5):
item = f"item-{i}"
q.put(item)
print(f"Produced {item}")
with condition:
condition.notify_all()
def consumer():
while True:
with condition:
condition.wait()
item = q.get()
print(f"Consumed {item}")
if item is None:
break
condition = threading.Condition()
prod_thread = threading.Thread(target=producer)
cons_thread = threading.Thread(target=consumer)
prod_thread.start()
cons_thread.start()
prod_thread.join()
q.put(None)
cons_thread.join()
什么原因可能导致了这个问题?
当消费者在生产者获取条件锁并发出通知之前调用 condition.wait() 时,就会出现问题。在这种情况下,消费者可能会无限期地等待而永远收不到信号。为了解决这个问题,消费者必须在保持条件锁的同时,在循环中不断检查队列的状态。此外,消除手动调用 condition.notify_all() 的需要,而是利用queue.Queue 的内置线程安全功能,可以简化同步过程。