什么是信号量(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 不阻塞.