学习版本3.5.2

Condition类是用来处理复杂线程的同步问题的。

__init__(self, lock=None) 初始化时候可以传入一个Lock对象,或者默认会生成一个RLock对象。
Condition提供了Lock类中的acquire()方法和release()方法
notify(self, n=1) 唤醒n个等待的线程
notify_all(self) 唤醒所有等待的线程
 
wait(self, timeout=None) 使当前线程进入等待池,在timeout时间之后自动唤醒,timeout=None时候就只能等待别的线程调用notify()来唤醒
wait_for(self, predicate, timeout=None) 比wait()方法多了一个predicate参数,predicate的返回值要求是bool值,返回为true时该线程就被唤醒,否则跟wait()一样

举个例子:一家工厂有两个生产产品的员工,但是只有一个生产环境,同一时间只能有一个人在生产产品,产品堆积了20个他们就会停止生产,有一个消耗产品的员工,当没有产品的时候他会打电话给工厂里面,叫里面的员工开始生产产品,并且自己等一会再去消耗。代码如下:

#/usr/bin/python3
# -*- utf-8 -*-
#学习版本3.5.2

import threading
import time

con = threading.Condition()
products = 0

class Product(threading.Thread):
    def run(self):
        global products
        while True:
            print(self.getName(),": 等待生产环境")
            con.acquire()
            print(self.getName(),": 准备生产")
            if products >= 20:
                print(self.getName(),": 放不下了,我先休息一下")
                con.notifyAll()
                con.wait()
            else:
                print(self.getName(),": 生产中")
                time.sleep(1)
                products += 1
                print(self.getName(),": 完成了一个")
                print(self.getName(),": 一共有:",products,"个")
                con.notifyAll()
            con.release()

    def mycall(cls):
        try:
            con.acquire()
        except RuntimeError as e:
            print(e)
        con.notify()
        con.release()

class Consumer(threading.Thread):
    def run(self):
        global products
        while True:
            if products > 0:
                print(self.getName(),": 消耗产品")
                products -= 1
            else:
                print(self.getName(),": 没了")
                print(self.getName(),": 等一会,打电话通知下")
                Product().mycall()
                time.sleep(3)

if __name__ == "__main__":
    p1 = Product(name="A")
    p2 = Product(name="B")
    c1 = Consumer(name="C")
    p1.start()
    p2.start()
    c1.start()
    print("main")


运行结果

A : 等待生产环境
A : 准备生产
B : 等待生产环境
A : 生产中
C : 没了
C : 等一会,打电话通知下
main
A : 完成了一个
A : 一共有: 1 个
A : 等待生产环境
B : 准备生产
B : 生产中
B : 完成了一个
B : 一共有: 2 个
B : 等待生产环境
A : 准备生产
A : 生产中
A : 完成了一个
A : 一共有: 3 个
A : 等待生产环境
B : 准备生产
B : 生产中
B : 完成了一个
B : 一共有: 4 个
B : 等待生产环境
A : 准备生产
A : 生产中
C : 消耗产品
C : 消耗产品
C : 消耗产品
C : 消耗产品
C : 没了
C : 等一会,打电话通知下
A : 完成了一个
A : 一共有: 1 个
A : 等待生产环境
B : 准备生产
B : 生产中
B : 完成了一个
B : 一共有: 2 个
B : 等待生产环境
A : 准备生产
A : 生产中
A : 完成了一个
A : 一共有: 3 个
A : 等待生产环境
B : 准备生产
B : 生产中
...