33, Python multi-threaded programming mutex and communication queue

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
主线程退出

Guess you like

Origin blog.csdn.net/zhaopeng01zp/article/details/109317816