我如何结束这个生产者-消费者脚本?

How do i end this producer-consumer script?

我正在尝试学习 python 中实现它的生产者-消费者模式。我可以让它工作,但出于某种原因,消费者一直在听队列中的某些内容并且不会结束脚本。

我知道这是预期的行为,因为生产者可以以消费者消耗的不同速率继续向队列中添加东西。但是,就我而言,我已经有一个要由队列处理的列表,我可以保证以后不会添加其他项目。

这是完整的工作代码:

from threading import Thread
import time
import random
from queue import Queue

queue = Queue(10)

class ProducerThread(Thread):
    def __init__(self, nums):
        super().__init__()
        self.nums = nums

    def run(self):
        global queue
        while self.nums:
            num = self.nums.pop(0)
            queue.put(num)
            print("Produced", num)
            time.sleep(1)

class ConsumerThread(Thread):
    def __init__(self, id):
        super().__init__()
        self.id = id

    def run(self):
        global queue
        while True:
            num = queue.get()
            ##do something here
            queue.task_done()
            print(f"Consumed {num} in consumer {self.id}")
            time.sleep(1)
 


p = ProducerThread(list(range(5)))

l1 = ConsumerThread(1)
l2 = ConsumerThread(2)

p.start()
l1.start()
l2.start()

p.join()
l1.join()
l2.join()

我可以在消费者中替换哪个条件while True以便它理解脚本结束?

提前致谢。

我的回答写出来了,如你所愿。

STOP_TOKEN = "STOP" # Anything that wouldn't normally be in your queue.

class ProducerThread(Thread):
    ...
    def run(self):
        global queue
        while self.nums:
            num = self.nums.pop(0)
            queue.put(num)
            print("Produced", num)
            time.sleep(1)
        queue.put(STOP_TOKEN)

    

class ConsumerThread(Thread):
    ...
    def run(self):
        global queue
        while True:
            num = queue.get()
            if num == STOP_TOKEN:
                break
            ##do something here
            queue.task_done()
            print(f"Consumed {num} in consumer {self.id}")
            time.sleep(1)