python-- 信号量 Semphore、事件 Event(python怎么读)

网友投稿 297 2022-08-25


python-- 信号量 Semphore、事件 Event(python怎么读)

信号量 Semphore

sem=Semphore(n):n是指初始化一把锁配几把钥匙,一个int型

拿钥匙,锁门 sem.acquire()

还钥匙,开门 sem.release()

信号量机制比锁机制多了一个计数器,这个计数器是用来计录当前剩几把钥匙的。当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。

对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1

from multiprocessing import Process, Semaphorel = Semaphore(3) # 实例化,传一个int型的值l.acquire() # 拿走1把钥匙,锁上门print(12)l.acquire() # 拿走1把钥匙,锁上门print(34)l.acquire() # 拿走1把钥匙,锁上门print(56)l.acquire() # 拿走1把钥匙,锁上门print(78)

结果:

123456# 只有三把钥匙,当遇到第四个l.acquire()时就阻塞了

释放锁

from multiprocessing import Process, Semaphorel = Semaphore(3) # 实例化,传一个int型的值l.acquire() # 拿走1把钥匙,锁上门print(12)l.acquire() # 拿走1把钥匙,锁上门print(34)l.acquire() # 拿走1把钥匙,锁上门print(56)l.release() # 释放钥匙l.acquire() # 拿走1把钥匙,锁上门print(78)

结果

12345678

案例

from multiprocessing import Process, Semaphoreimport timeimport randomdef func(i, sem): sem.acquire() print('第%s个人进入小黑屋,拿了钥匙锁上门' % i) time.sleep(2) print('第%s个人出去小黑屋,还了钥匙打开门' % i) sem.release()if __name__ == '__main__': sem = Semaphore(5) # 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋 # 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入 for i in range(20): p = Process(target=func, args=(i, sem,)) p.start()

结果:

第0个人进入小黑屋,拿了钥匙锁上门第1个人进入小黑屋,拿了钥匙锁上门第2个人进入小黑屋,拿了钥匙锁上门第3个人进入小黑屋,拿了钥匙锁上门第4个人进入小黑屋,拿了钥匙锁上门第0个人出去小黑屋,还了钥匙打开门第1个人出去小黑屋,还了钥匙打开门第5个人进入小黑屋,拿了钥匙锁上门第6个人进入小黑屋,拿了钥匙锁上门第2个人出去小黑屋,还了钥匙打开门第3个人出去小黑屋,还了钥匙打开门第7个人进入小黑屋,拿了钥匙锁上门第8个人进入小黑屋,拿了钥匙锁上门第4个人出去小黑屋,还了钥匙打开门第9个人进入小黑屋,拿了钥匙锁上门第5个人出去小黑屋,还了钥匙打开门第6个人出去小黑屋,还了钥匙打开门第10个人进入小黑屋,拿了钥匙锁上门第11个人进入小黑屋,拿了钥匙锁上门第7个人出去小黑屋,还了钥匙打开门第8个人出去小黑屋,还了钥匙打开门第9个人出去小黑屋,还了钥匙打开门第12个人进入小黑屋,拿了钥匙锁上门第13个人进入小黑屋,拿了钥匙锁上门第14个人进入小黑屋,拿了钥匙锁上门第10个人出去小黑屋,还了钥匙打开门第11个人出去小黑屋,还了钥匙打开门第14个人出去小黑屋,还了钥匙打开门第12个人出去小黑屋,还了钥匙打开门第13个人出去小黑屋,还了钥匙打开门第17个人进入小黑屋,拿了钥匙锁上门第18个人进入小黑屋,拿了钥匙锁上门第15个人进入小黑屋,拿了钥匙锁上门第19个人进入小黑屋,拿了钥匙锁上门第16个人进入小黑屋,拿了钥匙锁上门第18个人出去小黑屋,还了钥匙打开门第15个人出去小黑屋,还了钥匙打开门第17个人出去小黑屋,还了钥匙打开门第19个人出去小黑屋,还了钥匙打开门第16个人出去小黑屋,还了钥匙打开门

事件 Event

e = Event()e.set()e.clear()e.wait()e.is_set()# 事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态# 当is_set()的bool值为False时,e.wait()是阻塞状态# 当is_set()的bool值为True时,e.wait()是非阻塞状态# 当使用set()时,是把is_set的bool变为True# 当使用clear()时,是把is_set的bool变为False

红绿灯案例

from multiprocessing import Process, Eventimport timedef lighter(l): count = 0 l.set() # 先设置绿灯 while True: if count > 5 and count < 10: l.clear() # 把标志位清了,改为红 灯 print('\033[41;1m red light ...\033[0m') elif count > 10: l.set() # 变绿灯 count = 0 else: print('\033[42;1m green light...\033[0m') time.sleep(1) count += 1def car(name, l): while True: if l.is_set(): # 判断标志位是否存在 print('[%s] runing' % name) time.sleep(1) else: print('[%s] sees red light,waiting...' % name) l.wait() # 等待标志位设定 print('\033[34;1m[%s] green light is on,start going...\033[0m' % name)if __name__ == '__main__': l = Event() light = Process(target=lighter, args=(l,)) light.start() car1 = Process(target=car, args=('BMW', l)) car1.start()


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java开源区块链jdchain入门
下一篇:python-- 锁Lock(python编译器)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~