39_并发编程-信号量
一、定义
1、互斥锁同时只允许一个线程更改数据,而信号量Semaphore是同时允许一定数量的线程更改数据 。
假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。
2、实现:
信号量同步基于内部计数器,每调用一次acquire(),计数器减1;每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞。这是迪科斯彻(Dijkstra)信号量概念P()和V()的Python实现。信号量同步机制适用于访问像服务器这样的有限资源。信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念
1 import time
2 import random
3 from multiprocessing import Process,Semaphore
4
5 def dbj(i,s):
6 s.acquire()
7 print('%s号男主人公来洗脚'%i)
8 print('-------------')
9 time.sleep(random.randrange(3,6))
10 # print(time.time())
11 s.release()
12
13 if __name__ == '__main__':
14 s = Semaphore(4) #创建一个计数器,每次acquire就减1,直到减到0,那么上面的任务只有4个在同时异步的执行,后面的进程需要等待.
15 for i in range(10):
16 p1 = Process(target=dbj,args=(i,s,))
17 p1.start()