Day 38 Semaphore ,Event ,队列

Posted mengbin0546

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day 38 Semaphore ,Event ,队列相关的知识,希望对你有一定的参考价值。

什么是信号量(multiprocess.Semaphore)

互斥锁同时只允许一个线程更改数据,而信号量semaphore是同时允许一定数量的线程更改数据.

假设商场里有4个迷你唱吧 ,所以通过同时可以进去4个人,如果来了五个人就要在外面等等,等到有人出来才能再进去玩.

实现:

信号量同步基于内部计数器,每次用一次acquire(),计数器减1,每次调用一次release(),计数器加1 ,当计数器为0 时,acquire()调用被阻塞,,信号量和进程池的概念很像,但是也要区分开,信号量设计到加锁的概念.

一套资源 同一时间 只能被n个人访问

 

from multiprocessing import Process,Semaphore
import time,random
def ktv(i,sem):
sem.acquire() #获取钥匙
print(‘%s 走进ktv‘%i)
time.sleep(random.randint(1,5))
print(‘%s 走出ktv‘%i)
sem.release() #释放钥匙.
if __name__ == ‘__main__‘:
sem = Semaphore(2) #ktv 里只有2个位置,限定进程的访问量。
for i in range (6): #六个人来访问
p =Process(target=ktv, args=(i,sem)) #实例化一个子进程.
p.start()#

结果 :同时允许两个人进入。

0 走进ktv
2 走进ktv
0 走出ktv
1 走进ktv
1 走出ktv
4 走进ktv
4 走出ktv
3 走进ktv
2 走出ktv
5 走进ktv
3 走出ktv
5 走出ktv

 

sem =Semaphore(4)
sem.acquire()
print("第一把钥匙 ")
sem.acquire()
print("第二把钥匙 ")
sem.acquire()
print("第三把钥匙 ")
sem.acquire()
print("第四把钥匙 ")
sem.acquire()
print("第五把钥匙 ")

结果 (只能获取到四把钥匙.)

第一把钥匙 
第二把钥匙 
第三把钥匙 
第四把钥匙 

 

事件 --multiprocess.Event

Python 线程 的事件用于主线程控制其他线程的执行,事件的主要提供了三个方法set ,wait ,clear。

事件处理的机制,全局定义了一个 ‘Flag’ ,如果flag的值为false,那么程序执行event.wait方法时就会阻塞,如果 flag 值为True,那么

event.wait 方法时不在阻塞

clear: 将flag 设置为False

set :将 flag 设置为True

通过一个信号 来控制多个进程 同时执行或者阻塞 

from multiprocessing import Event 

一个信号可以使所有的进程接触阻塞

一个世界被创建之后,默认是阻塞状态  

 

from multiprocessing import Event
e =Event() #创建一个世界
print(e.is_set())#查看一个事件的状态,默认是阻塞状态。 #结果为False
e.set() #将这个事件状态改为True
print(e.is_set())#结果为True
e.wait()#是根据e.is_set()的值来决定是否阻塞的.
print(123435) #打印出来 结果为123435
e.clear() #将这个事件的状态改为False
print(e.is_set())#False
e.wait()#等待事件的信号被变成 True
print(**10)

set 和clear 

分别用来修改一个事件的状态True或者False

is_set 是用来查看事件的状态 

wait是依据事件的状态来决定自己是否在wait处阻塞

  #False阻塞  , True 不阻塞.

 

以上是关于Day 38 Semaphore ,Event ,队列的主要内容,如果未能解决你的问题,请参考以下文章

μCOS-II系统之事件(event)的使用规则及Semaphore实例

Day835.Semaphore -Java 并发编程实战

Day835.Semaphore -Java 并发编程实战

经典线程同步 信号量Semaphore

网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue(示例代码

Python的线程11 Semaphore信号量