python多线程第三讲:条件变量Condition

目录

python多线程第一讲:多线程入门
python多线程第二讲:Lock和RLock

前言

现在我们有个需求,就是有两个函数一个会依次在控制台输出1、3然后结束,另一个线程依输出2、4然后结束。
单线程情况下:

def dayin13():
    print(1)
    print(3)


def dayin24():
    print(2)
    print(4)

if __name__ == '__main__':
	dayin13()
	dayin24()

控制台输出:
1
3
2
4

给打印操作加锁之后:

def dayin13(l):
	l.acquire()
    print(1)
    l.release()
    l.acquire()
    print(3)
    l.release()


def dayin24():
	l.acquire()
    print(2)
    l.release()
    l.acquire()
    print(4)
    l.release()
    
if __name__ == '__main__':
    t1 = threading.Thread(target=dayin13)
    t2 = threading.Thread(target=dayin24)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

控制台输出:
1
3
2
4

不能顺序输出1234的原因在于锁只能保证当前线程中acquire和release之间代码执行时别的线程无法再次acquire而要等当前线程执行了release才能成功获得;并不能保证release后执行权就会被别的线程获得。

上文来说就是不能保证打印完1后回去打印2。也不能保证打印完2后会打印3。所以Lock不能控制线程的有序执行。那什么可以呢——condition。

condition使用
def A(cond):
    with cond: 
    #condition的使用必须先acquire,使用完必须release。
    # 且condition实现了上下文协议,即enter魔法函数和exit魔法函数,分别执行了acquire和release操作,所以我们用with管理
        print(1)
        cond.notify()
        cond.wait()
        print(3)
        cond.notify()
        cond.wait()


def B(cond):
    with cond:
        cond.wait()
        print(2)
        cond.notify()
        cond.wait()
        print(4)


if __name__ == "__main__":
    cond = threading.Condition()
    t1 = threading.Thread(target=A, args=(cond,))
    t2 = threading.Thread(target=B, args=(cond,))
    t2.start()
    t1.start()
    t1.join()
    t2.join()

Loading…

你可能感兴趣的:(python多线程)