进程_线程 之 --- 生产者消费者
Posted tmmm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程_线程 之 --- 生产者消费者相关的知识,希望对你有一定的参考价值。
同步锁
acquire([timeout])/release(): 调用关联的锁的相应方法。
wait([timeout]): 调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。
notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。
notifyAll(): 调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常
生产者消费者
1 import threading 2 from time import sleep 3 4 products = 0 # 定义一个产品变量 5 condition = threading.Condition() # 创建一个同步锁。为了保证生产者在生产过程中,消费者不去消费。不能让消费者去消费还在生产的产品 6 # lock = threading.Lock() 7 # 如果既有读又有写(生产者和消费者模式),不能加互斥锁,容易造成死锁
- 生产者
1 # 定于一个生产者类 2 class Producter(threading.Thread): # 继承自threading.Thread。重写线程类 3 ix = [0] # 生产者的实例个数 4 5 def __init__(self,): 6 super().__init__() 7 self.ix[0] += 1 8 self.setName("生成者" + str(self.ix[0])) 9 10 def run(self): 11 global products 12 while True: 13 if condition.acquire(): # 加同步锁 14 if products < 10: 15 products += 1 16 print("%s:库存少于10个,努力生产件产品,现在产品的总量为:%d"%(self.getName(),products)) 17 else: 18 print("%s:库存多于10个,不需要继续生产,现在产品的总量为:%d"%(self.getName(),products)) 19 condition.wait() # 等待一下 20 condition.release() 21 sleep(2)
- 消费者
1 # 定义一个消费者 2 class Consumer(threading.Thread): 3 ix = [0] 4 5 def __init__(self): 6 super().__init__() 7 self.ix[0] += 1 8 self.setName("消费者"+str(self.ix[0])) 9 10 def run(self): 11 global products 12 while True: 13 if condition.acquire(): # 加同步锁 14 if products > 1: 15 products -= 1 16 print("%s:我消费了1个产品,现在产品的数量为:%d"%(self.getName(),products)) 17 else: 18 print("%s:就剩1个产品了,我将停止消费,现在产品的数量为:%d" % (self.getName(), products)) 19 condition.wait() # 锁等一下 20 condition.release() 21 sleep(2)
- 调用
1 if __name__ == ‘__main__‘: 2 for _ in range(2): 3 p = Producter() 4 p.start() 5 for _ in range(10): 6 c = Consumer() 7 c.start()
- 结果
1 """ 2 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:1 3 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:2 4 消费者1:我消费了1个产品,现在产品的数量为:1 5 消费者2:就剩1个产品了,我将停止消费,现在产品的数量为:1 6 消费者3:就剩1个产品了,我将停止消费,现在产品的数量为:1 7 消费者4:就剩1个产品了,我将停止消费,现在产品的数量为:1 8 消费者5:就剩1个产品了,我将停止消费,现在产品的数量为:1 9 消费者6:就剩1个产品了,我将停止消费,现在产品的数量为:1 10 消费者7:就剩1个产品了,我将停止消费,现在产品的数量为:1 11 消费者8:就剩1个产品了,我将停止消费,现在产品的数量为:1 12 消费者9:就剩1个产品了,我将停止消费,现在产品的数量为:1 13 消费者10:就剩1个产品了,我将停止消费,现在产品的数量为:1 14 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:2 15 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3 16 消费者1:我消费了1个产品,现在产品的数量为:2 17 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:3 18 消费者1:我消费了1个产品,现在产品的数量为:2 19 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3 20 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:4 21 消费者1:我消费了1个产品,现在产品的数量为:3 22 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:4 23 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:5 24 消费者1:我消费了1个产品,现在产品的数量为:4 25 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:5 26 """
以上是关于进程_线程 之 --- 生产者消费者的主要内容,如果未能解决你的问题,请参考以下文章
JUC - 多线程之Synchronized和Lock锁;生产者消费者模式