我是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内置的线程安全功能可以简化同步过程。
def producer():
for i in range(5):
item = f"item-{i}"
q.put(item)
print(f"Produced {item}")
def consumer():
while True:
item = q.get()
print(f"Consumed {item}")
if item is None:
break