提前设定好,一个房间只有4个床(计数器现在为4),那么同时只能四个人进来,谁先来的谁先占一个床(acquire,计数器减1),4个床满了之后(计数器为0了),第五个人就要等着,等其中一个人出来(release,计数器加1),他就去占用那个床了。
互斥锁同时只允许一个线程更改数据,而信号量Semaphore是同时允许一定数量的线程更改数据 。 假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。 实现: 信号量同步基于内部计数器,每调用一次acquire(),计数器减1;每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞。这是迪科斯彻(Dijkstra)信号量概念P()和V()的Python实现。信号量同步机制适用于访问像服务器这样的有限资源。 信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念
# coding:utf-8 import time import random from multiprocessing import Process, Semaphore def go_ktv(i, sem): print("user%s马上要进>>>>>ktv." % i) sem.acquire() print("user%s正在....ktv." % i) time.sleep(random.randint(0, 3)) sem.release() print("user%s刚出<<<<<<ktv." % i) if __name__ == '__main__': sem = Semaphore(4) p_lst = [] for i in range(6): p = Process(target=go_ktv, args=(i, sem)) p.start() p_lst.append(p) [pp.join() for pp in p_lst] print("所有的人都去过ktv了.") # user2马上要进>>>>>ktv. # user2正在....ktv. # user0马上要进>>>>>ktv. # user0正在....ktv. # user1马上要进>>>>>ktv. # user1正在....ktv. # user4马上要进>>>>>ktv. # user4正在....ktv. # user3马上要进>>>>>ktv. # user5马上要进>>>>>ktv. # user2刚出<<<<<<ktv. # user3正在....ktv. # user3刚出<<<<<<ktv. # user5正在....ktv. # user5刚出<<<<<<ktv. # user0刚出<<<<<<ktv. # user1刚出<<<<<<ktv. # user4刚出<<<<<<ktv. # 所有的人都去过ktv了.