from threading import Thread, Condition
from queue import Queue
import random
import time
condition = Condition()
products = Queue(5)
class Producer(Thread):
def __init__(self, thread_id):
super().__init__()
self.thread_id = thread_id
def run(self):
while True:
if condition.acquire():
if not products.full(): # 如果队列不是满,生产数据
products.put(random.randint(1, 100))
print("Call consumer now, we have products")
condition.notify() # 通知消费者消费
else: #如果队列是满的,通知消费者,并停止生产
condition.notify()
condition.wait()
condition.release()
time.sleep(0.1)
class Consumer(Thread):
def __init__(self, thread_id):
super().__init__()
self.thread_id = thread_id
def run(self):
while True:
if condition.acquire():
if not products.empty(): # 如果队列不为空,则消费数据
print("consumer get a product now: %d" %products.get())
else: # 如果产品队列是空的,通知生产者开始生产,并停止消费
print("No products now, wait...")
condition.notify()
condition.wait()
condition.release()
time.sleep(0.1)
p = Producer('producer')
c = Consumer('consumer')
p.start()
c.start()
网友评论