我如何结束这个生产者-消费者脚本?
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)
我正在尝试学习 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)