Lock版本的生产者消费者的不足:

Lock版本的生产者与消费者模式可以正常的运行。但是存在一个不足,在消费者中,总是通过while True死循环并且上锁的方式去判断钱够不够。上锁是一个很耗费CPU资源的行为。因此这种方式不是最好的。还有一种更好的方式便是使用threading.Condition来实现。threading.Condition可以在没有数据的时候处于阻塞等待状态。一旦有合适的数据了,还可以使用notify相关的函数来通知其他处于等待状态的线程。这样就可以不用做一些无用的上锁和解锁的操作。可以提高程序的性能。

threading.condition介绍:

其实它就是继承自threading.lock,可以在全局上上锁

acquire():上锁

release():解锁

wait():将当前线程处于等待状态,并且会释放锁。可以被其他线程使用notify和notify_all函数唤醒。被唤醒后会继续等待上锁,上锁后继续执行下面的代码。

notify():通知某个正在等待的线程,默认是第1个等待的线程。

notify_all():通知所有正在等待的线程。notify和notify_all不会释放锁。并且需要在release之前调用。

Condition版本代码: