代码之家  ›  专栏  ›  技术社区  ›  András Takács

Python多线程问题

  •  3
  • András Takács  · 技术社区  · 10 月前

    我是Python新手,在使用队列的多线程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()
    

    是什么导致了这个问题?

    1 回复  |  直到 10 月前
        1
  •  2
  •   Michael Williams    10 月前

    当消费者在生产者获取条件锁并发出通知之前调用condition.wiat()时,就会出现问题。在这种情况下,消费者最终可能会无限期地等待,而从未收到任何信号。为了解决这个问题,消费者在保持条件锁的同时,不断检查循环中队列的状态非常重要。此外,消除了手动调用condition.nnotify_all()的需要,而是利用了队列的内置线程安全特性。队列可以简化同步过程。

    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