zoukankan      html  css  js  c++  java
  • python-43-进程锁/信号量/事件

    前言

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

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

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

    一、进程锁

    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()

    二、信号

    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

  • 相关阅读:
    iOS使用webView 加载网页,在模拟器中没有问题,而真机却白屏了。App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist f
    xcode快捷方式 一 快速找到对应文件
    cell 和 cellHeight的先后执行顺序
    tableView 选中cell时,获取到当前cell
    ios10 UNNtificationRequest UNUserNotificationCenter的应用 推送之本地推送
    下载老版本的Xcode
    敏捷开发
    关于tableView的错误提示
    iOS的内购
    PHP常用算法和数据结构示例
  • 原文地址:https://www.cnblogs.com/gsxl/p/12585880.html
Copyright © 2011-2022 走看看