# 多进程中的组件
# 信号量
# 举例说概念:现在有4个门,只能进4个人。一套资源同一时间只能被N个人访问。这里将N个人比作N个进程,一套资源这里比作代码
# 某一段代码 同一时间只能被N个进程执行
# 有一个房子,房子就是要保护的代码(限定进程访问的代码),房子只有一个门,门上有一串钥匙,有多少把钥匙是你规定的,此时当有一个进程来了,
# 这个进程拿一把钥匙然后开门进到了房子中,此时其他进程来了,都会拿钥匙进入到房子里,知道其他进程来时发现没有钥匙了就无法打开门进去了
# 只有当房子里的进程出来了,将钥匙又放到了门上,其他在房子门口等的进程中有一个进程就可以拿到这把钥匙进到屋里,这就是信号量的概念
# 同一段代码,只能被N个进程执行,当超过了N个进程要执行这段代码时,超过的进程需要等待前面的进程执行这段代码结束后,归还入口数,后面的进程才可以进入
# import time
# import random
# from multiprocessing import Process
#
# # 下面的例子,想要模拟一个现象是,比如ktv只有4个,一个ktv只能进去一个人(一个进程)。但是下面的例子实际上,20个进程一下子全部都进入到了ktv中
# def ktv(i):
# print(' %s 走进ktv' % i)
# time.sleep(random.randint(1, 5)) # 模拟在ktv唱歌的时间
# print(' %s 走出ktv' % i)
#
# if __name__ == '__main__':
# for i in range(20):
# p = Process(target=ktv, args=(i,))
# p.start()
import time
import random
from multiprocessing import Process
from multiprocessing import Semaphore # 导入进程的信号量模块
# 下面的例子,想要模拟一个现象是,比如ktv只能进入4个人,同一时间只能有4个进程进去
def ktv(i, sem):
sem.acquire() # 拿钥匙,拿一个钥匙就会少一个钥匙,当拿到钥匙没有时,再进来的进程就会阻塞在这里,只有当前面拿钥匙的进程将钥匙归还,当前进程才能拿到钥匙向下执行
print(' %s 走进ktv' % i)
time.sleep(random.randint(1, 5)) # 模拟在ktv唱歌的时间
print(' %s 走出ktv' % i)
sem.release() # 还钥匙
if __name__ == '__main__':
sem = Semaphore(4) # 实例化一个信号量,参数表示有几把钥匙,
for i in range(20):
p = Process(target=ktv, args=(i, sem))
p.start()