Python多线程问题

问题描述 投票:0回答:1

我是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()

什么可能导致此问题?

python multithreading queue
1个回答
0
投票

当消费者在生产者获取条件锁并发出通知之前调用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
© www.soinside.com 2019 - 2024. All rights reserved.