python并发编程(三)——进程间的控制

进程的控制
锁Lock:加锁后,同一份资源只能一个进程去调用
信号量Semaphore:同一时间某一个资源可以同时允许指定个数的进程去访问
事件Event:通过信号来控制所有的进程同时执行或进入阻塞

信号量Semaphore

from multiprocessing import Semaphore
利用锁的原理实现的,内置了一个计数器,同一时间只有指定数量的进程能执行某一段锁定的代码
from multiprocessing import Process
from multiprocessing import Semaphore
import time
def fun(i,sem):
    sem.acquire() #获取信号  相当于计数器-1
    print('%s正在吃饭'%i)
    time.sleep(3)
    print('---%s吃完了饭'%i)
    sem.release() #释放信号 相当于计数器+1

if __name__ == '__main__':
    sem = Semaphore(3) #同时只允许3个进程同时访问
    for i in range(10):
        p = Process(target = fun,args = (i,sem))
        p.start()

事件Event

from multiprocessing import Event
一个事件可以使所有的进程进入阻塞状态
也可以控制所有进程解除阻塞
一个事件被创建后默认是阻塞状态
from multiprocessing import Event
e = Event() #创建一个事件,默认是阻塞状态
print(e.is_set())#False 查看一个事件的状态,默认是阻塞状态
print('123') #正常输出,进程阻塞还依赖于wait()
e.set() #将事件的状态改为True,写在wait()之前
e.wait()    #当前事件状态为false就阻塞当前代码
print('456') 
e.clear() #将事件的状态改为False

#常常用于设定多个进程间的某种状态,判定当前进程是否继续执行

示例:红绿灯

from multiprocessing import Process , Event
import time 
import random
def light(e):
    while True:
        if e.is_set():
            e.clear() #将True改为False
            print('红灯亮')
        else:
            e.set() #将False改为True
            print('绿灯亮')
        time.sleep(2)   
    
def person(e):
    if not e.is_set():#红灯
        print('停止过马路')
        e.wait()   
    print('开始过马路') 

if __name__ == '__main__':
    e = Event() #创建事件
    p = Process(target = light,args = (e,))#创建进程
    p.start()#启动进程
    for i in range(20):
        c = Process(target = person,args = (e,))
        c.start()
        time.sleep(random.randint(1,3))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值