进程中的信号量

多进程与信号量
# 多进程中的组件
    # 信号量
        # 举例说概念:现在有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()

 

转载于:https://www.cnblogs.com/whylinux/p/9818879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值