首先看不加锁时如果运行多线程会出现的情况
可以看到不加lock的话输出是乱序的,并不会等待上一个线程完成后在运行,加上锁之后:
加上lock之后lock.acquire与lock.release之间的运行过程在运行结束之后才会让其他进程进来运行。
利用event实现线程之间的交互:
红绿灯实例,event事件
import time, threading
event = threading.Event()
# 交通灯
def lighter():
count = 0
while True:
if count < 5: # 绿灯
event.set() #设置标志位
print("\033[42;1m 绿灯亮\033[0m")
elif count > 10:
count =0 # 清零重新计数
else: # 红灯
event.clear() # 清空标志位
print("\033[41;1m 红灯亮\033[0m")
time.sleep(1)
count += 1
# 车辆
def car(name):
while True:
if event.is_set(): # 绿灯亮
print("[%s]绿灯行..." % name)
time.sleep(1)
else:
print("[%s]红灯停!!!" % name)
event.wait() # 等待标志位设定
print("\033[34;1m绿灯出发\033[0m")
# 启动交通灯
t_lighter = threading.Thread(target=lighter)
t_lighter.start()
# 放入车辆
t_car1 = threading.Thread(target=car, args=("奥迪车",))
t_car2 = threading.Thread(target=car, args=("大众车",))
t_car1.start()
t_car2.start()
可以看到event可以用于两个线程交互,通过红绿灯线程设定event,然后car线程根据event的状况来改变自己的行动,当遇到红灯时event被clear, 这时car线程被阻塞用来模拟等红绿灯的情况。