############### 信号量和事件 ##############
# 信号量
# 信号量就是控制只能有n个线程能访问这段代码
# from threading import Semaphore,Thread
# import time
# def func(sem,a,b):
# sem.acquire()
# time.sleep(1)
# print(a+b)
# sem.release()
#
# sem = Semaphore(4)
# for i in range(10):
# t = Thread(target=func,args=(sem,i,i+5))
# t.start()
# 事件:
# 事件被创建的时候是false状态,这个false状态会导致wait被阻塞,
# true状态的时候,wait就不阻塞了
# clear,设置为false
# set,设置状态未false,
# 上次举例的是红绿灯的例子,
# 现在我们举一个例子,检测数据库的可连接情况
# 启动两个线程,
# 第一个线程连接数据库,
# 等待一个信号,告诉我们之间的网络是通的
# 第二个线程,检测和数据自己之间的网络是否是通的
# 通了之后把事件的状态改为true,
import time,random
from threading import Thread,Event
def connect_db(e):
count = 0
while count < 3:
# e.wait() # 这个是一直等待,这种比较浪费资源,
e.wait(0.1) # 这是我只等待1秒,否则我就不等你了,# 但是我应该有一个重连的过程,比如三次,三次都连接不上,就断掉了
if e.is_set() == True:
print("连接数据库")
break
else:
print("连接失败")
count += 1
else:
raise TimeoutError("数据库连接超时") # 主动报异常
def check_web(e):
time.sleep(random.randint(0,2))
e.set()
e = Event()
t1 = Thread(target=connect_db,args=(e,))
t2 = Thread(target=check_web,args=(e,))
t1.start()
t2.start()
############### 线程的条件和定时器 ##############
# 条件
from threading import Condition,Thread,Timer
# 可以把条件视为一个更加复杂的锁
# 同时也有两个方法,acquire,release
# 一个条件被创建,默认也是一个false状态,会影响wait处于等待状态
# notify(int),这是制造钥匙,参数是制造多少把钥匙
# 这个几乎就是只会出现在面试里面,平时基本不会用到,
#
# def func(con,i):
# con.acquire()
# con.wait() # 在等待钥匙,
# print("在第%s个循环里"%i)
# con.release()
#
#
# con = Condition()
# for i in range(10):
# Thread(target=func,args=(con,i)).start()
#
#
# while True:
# num = int(input(">>>"))
# con.acquire()
# con.notify(num) # 制造钥匙,
# con.release()
# 定时器:
def func():
print("时间同步")
Timer(2,func).start() # 等待两秒钟开启一个线程,
来源:https://www.cnblogs.com/andy0816/p/12381478.html