条件变量同步(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]
浙公网安备 33010602011771号