首页 > 编程语言 > 详细

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

时间:2020-03-28 12:13:18      阅读:68      评论:0      收藏:0      [点我收藏+]

前言

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

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

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

一、进程锁

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

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

技术分享图片

2、运用进程锁:Lock

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

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

def buy(i,lock):
    lock.acquire()                          # 拿钥匙
    with open(rtest.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(rtest.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()

技术分享图片

二、信号

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(

技术分享图片

三、事件

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

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

技术分享图片

将事件堵塞状态设为:False

技术分享图片

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)

技术分享图片

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

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

原文:https://www.cnblogs.com/gsxl/p/12585880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!