Write a producer consumer test Demo to demonstrate:
print("Test Thread")
from threading import Thread
from threading import Lock
import time
from queue import Queue
# == False时退出所有线程
is_running = True # python的变量一般不大写
# 互斥锁
mux = Lock() # 锁的申请原则:尽晚申请,尽早释放
# 产品队列
products = Queue()
# 生产者线程
class Producer(Thread):
def __init__(self):
Thread.__init__(self)
print("Producer Created!")
# 线程入口函数,具体要启动的一个线程
def run(self):
print("In Producer Thread")
product_id = 1000
while is_running:
product_id += 1
# 获取锁
mux.acquire()
print("produce a product", product_id)
# 生产者生产完这个产品之后,应该把这个产品放入队列
products.put(product_id)
# 释放锁
mux.release()
time.sleep(1)
print("Producer thread exited")
# 消费者线程
class Consumer(Thread):
def __init__(self):
Thread.__init__(self)
print("Consumer Created!")
# 线程入口函数,具体要启动的一个线程
def run(self):
print("In Consumer Thread")
while is_running:
# 获取锁
mux.acquire()
if products.empty():
mux.release() # 不释放会死锁
continue
print("consumed a product", products.get())
# 释放锁
mux.release()
time.sleep(1)
print("Consumer thread exited")
producer = Producer()
consumer = Consumer()
producer.start()
consumer.start()
threadList = [producer, consumer]
time.sleep(5) # 主线程等待5秒之后,才发出is_running为False
is_running = False
time.sleep(5)
# 主线程退出前,要先等待所有子线程退出(最好主线程的等待也要设置一个超时时间,避免无限等待)
for thd in threadList:
thd.join() # 等待线程退出
print("主线程退出")
Program output:
Test Thread
Producer Created!
Consumer Created!
In Producer Thread
produce a product 1001
In Consumer Thread
consumed a product 1001
produce a product 1002
consumed a product 1002
produce a product 1003
consumed a product 1003
produce a product 1004
consumed a product 1004
produce a product 1005
consumed a product 1005
Producer thread exited
Consumer thread exited
主线程退出