条件变量同步(Condition)

有一类线程需要满足条件之后才能够继续执行,Python提供了threading.Condition对象用于条件变量线程的支持,它除了能提供RLock()或Lock()的方法外,还提供了wait()、notify()、notifyAll()方法。

lock_con=threading.Condition([Lock/Rlock]):锁是可选选项,不传人锁,对象自动创建一个RLock()。

wait():条件不满足时调用,线程会释放锁并进入等待阻塞

notify():条件创造后调用,通知等待池激活一个线程;

notifyAll():条件创造后调用,通知等待也激活所有线程。

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: Conditional_variable
# time: 2021/04/05

import threading,time
from random import randint
class Producer (threading.Thread):
    def run(self):
        global L
        while True:
            val = randint(0,100)
            print('生产者',self.name,"Append"+str(val),L)
            if lock_con.acquire():
                L.append(val)
                lock_con.notify()   #激活wait()
                lock_con.release()  #释放锁
            time.sleep(3)
class Consumer(threading.Thread):
    def run(self):
        global L
        while True:
            lock_con.acquire()  #当激活wait(),从这里走。
            if len(L) == 0:
                lock_con.wait() #释放锁,再阻塞
            print('消费者',self.name,":Delete"+str(L[0]),L)
            del L[0]
            lock_con.release()
            time.sleep(1)

if __name__ == "__main__":
    L = []
    lock_con = threading.Condition()    #创建条件变量锁
    threads = []
    lock_con = threading.Condition()
    threads = []
    for i in range(5):
        threads.append(Producer())
    threads.append(Consumer())
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print('--------xiaohuyisi........')

/home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/join/Conditional_variable.py
生产者 Thread-1 Append92 []
生产者 生产者 Thread-3 生产者 Thread-4Thread-2 Append97  [92]
Append78 Append1[92, 97]
 生产者[92, 97, 78]
 消费者 Thread-6 :Delete92 [92, 97, 78, 1]
Thread-5 Append98 [97, 78, 1]
消费者 Thread-6 :Delete97 [97, 78, 1, 98]
消费者 Thread-6 :Delete78 [78, 1, 98]
生产者 Thread-3 Append57 [1, 98]
生产者生产者生产者 Thread-1 Append13 [1, 98, 57]
 生产者 Thread-4 Thread-2  Append96 Append36 [1, 98, 57, 13]
Thread-5[1, 98, 57, 13, 96] Append32
 [1, 98, 57, 13, 96, 36]
消费者 Thread-6 :Delete1 [1, 98, 57, 13, 96, 36, 32]