信号量和事件
(一)信号量
- 信号量Semahpore(同线程一样)
(1)引入
- 互斥锁是 同一时刻只能由一个线程更改数据,而信号量是同一时刻可以允许一定数量的线程更改数据
- 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据
- 比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去
- 如果指定信号量为3,那么来一个人获得一把锁,计数加1,当计数等于3时,后面的人均需要等待。
- 一旦释放,就有人可以获得一把锁
信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念
"""信号量"""
# 信号量 可以允许同一时刻多个线程修改数据
# 导入模块
from multiprocessing import Process , Semaphore
import time
def run_task(sem,i):
# 对信号量加锁
sem.acquire()
print(f"子进程{i}")
# 设置io阻塞
time.sleep(2)
# 信号量解锁
sem.release()
def main_process():
# 创建信号量池
sem = Semaphore(3)
# 创建进程对象
task_list=[Process(target=run_task,args=(sem,i)) for i in range(1,11)]
# 开启进程
[task.start() for task in task_list]
# 等待子进程结束
[task.join() for task in task_list]
if __name__ == '__main__':
main_process()
# 子进程1
# 子进程3
# 子进程2
# 子进程5
# 子进程4
# 子进程6
# 子进程7
# 子进程8
# 子进程9
# 子进程10
# 允许同一时刻多个线程修改数据
(二)事件
(1)什么是事件
- Event(同线程一样)
(2)事件处理方法
- python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法set、wait、clear
- 事件处理的机制
- 全局定义了一个Flag
- 如果Flag为False,那么当程序执行event.wait方法就会阻塞
- 如果Flag为True,那么当程序执行event.WAIT时不会阻塞
- clear 将Falg设置为False
- set 将Flag 设置为True
from multiprocessing import Process,Event
import time,random
def car(e,n):
while True:
if not e.is_set(): #Flase
print('\033[31m红灯亮\033[0m,car%s等着' %n)
e.wait()
print('\033[32m车%s 看见绿灯亮了\033[0m' %n)
time.sleep(random.randint(3,6))
if not e.is_set():
continue
print('走你,car', n)
break
def police_car(e,n):
while True:
if not e.is_set():
print('\033[31m红灯亮\033[0m,car%s等着' % n)
e.wait(1)
print('灯的是%s,警车走了,car %s' %(e.is_set(),n))
break
def traffic_lights(e,inverval):
while True:
time.sleep(inverval)
if e.is_set():
e.clear() #e.is_set() ---->False
else:
e.set()
if __name__ == '__main__':
e=Event()
# for i in range(10):
# p=Process(target=car,args=(e,i,))
# p.start()
for i in range(5):
p = Process(target=police_car, args=(e, i,))
p.start()
t=Process(target=traffic_lights,args=(e,10))
t.start()
print('============》')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY