python-43-进程锁/信号量/事件

前言

锁:Lock,多个进程中同一时间,只能排序执行程序。(一把钥匙只能进入一个,归还钥匙后面的拿钥匙进入一个,类推)

信号:Semaphore,多个进程中同一时间,同时被N个进程执行。

事件:Event,通过一个信号控制多个进程,同时执行或阻塞。

一、进程锁

1、进程锁,比如抢票会有多个用户一起抢。

没有锁进程的情况下:发现余票只有一张,但每个进程都能抢到票了,实际也就只有一张改怎么办?

python-43-进程锁/信号量/事件_第1张图片

2、运用进程锁:Lock

这样就可以解决类似这样的问题。

from multiprocessing import Process,Lock
import time,json
def find():
    with open(r'test.py')as f:
        d = json.load(f)
    print('剩余免费门票:%s'%d['count'])

def buy(i,lock):
    lock.acquire()                          # 拿钥匙
    with open(r'test.py')as f:
        d = json.load(f)
    if d['count']<=0:print('门票已被抢完~')
    else:
        print('恭喜用户 %s 成功抢到门票了'%i)
    if d['count']!=0:d['count']-=1
    time.sleep(0.2)
    with open(r'test.py','w')as f:
        json.dump(d,f)
    lock.release()                          # 还钥匙
if __name__ == '__main__':
    for i in range(1):       # 5个进程同时查询
        p=Process(target=find)
        p.start()
    lock=Lock()
    for i in range(5):
        p1=Process(target=buy,args=(i,lock))
        p1.start()

python-43-进程锁/信号量/事件_第2张图片

二、信号

1、信号量-Semaphore:比如一个程序最多2个进入。

基本原理类似锁中的执行,锁是单个进入,在锁的基础上使用了一个内置的计数器,从而达到多个同时进入。

可以任意设置同时最多进入多少个。

# 1、信号量-Semaphore:比如一个程序最多2个进入
from multiprocessing import Process,Semaphore
import time
def func(i,sem):
    sem.acquire()
    print('用户 %s 进入了'%i)
    time.sleep(5)
    print('用户 %s 退出了'%i)
    sem.release()
if __name__ == '__main__':
    sem=Semaphore(2)        # 设置能执行N个同时执行
    for i in range(1,5):
        p=Process(target=func,args=(i,sem))
        p.start(

python-43-进程锁/信号量/事件_第3张图片

三、事件

  • 一个信号可以是所有的进程都进入阻塞状态
  • 也可以控制所有的进程解除阻塞,创建时默认为阻塞状态

1、Event:通过一个信号控制多个进程,同时执行或阻塞。

from multiprocessing import Event
e=Event()
e.is_set()          # 创建一个事件,默认为阻塞状态:False
print('阻塞前~')
# e.set()             # 将事件堵塞状态设为:True
e.wait()            # 如果is_set()的值为False,那么进行堵塞,否则不堵塞
e.clear()           # 将事件的堵塞状态清空,即为默认状态:False
print('阻塞后~~~')

将事件堵塞状态设为:True

python-43-进程锁/信号量/事件_第4张图片

将事件堵塞状态设为:False

python-43-进程锁/信号量/事件_第5张图片

2、事件实例:红绿灯事件

from multiprocessing import Process,Event
import time
def func(e):
    while 1:
        if e.is_set():
            e.clear()
            print('红灯停~~')
        else:
            e.set()
            print('绿灯亮起~')
        time.sleep(3)
def car(i,e):
    if not e.is_set():
        print('%s 等红灯中==' % i)
        e.wait()
    print('%s 通行中-->' % i)

if __name__ == '__main__':
    e=Event()
    p=Process(target=func,args=(e,))
    p.start()
    for i in range(1,11):
        p1=Process(target=car,args=(i,e))
        p1.start()
        time.sleep(0.5)

python-43-进程锁/信号量/事件_第6张图片

欢迎来大家QQ交流群一起学习:482713805

你可能感兴趣的:(python-43-进程锁/信号量/事件)