zoukankan      html  css  js  c++  java
  • 进程同步控制 Lock Semaphore Event

    一.Lock

    当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题
    加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改
    lock=Lock() lock.acquire() # 拿钥匙进门 lock.release() # 还钥匙

    抢票系统

    from multiprocessing import Process
    from multiprocessing import Lock
    import json
    import time
    # def show_ticket():
    #     with open(a,"r",encoding="utf-8") as f:
    #         dic=json.load(f)   #用load
    #         print("余票为%s"%(dic["ticket"]))
    def buy_ticket(i,lock):
        lock.acquire()  # 拿钥匙进门
        with open("D:lianxipython网络编程和并发编程d37\ticket","r",encoding="utf-8") as f:
            dic=json.load(f)
            if dic["ticket"] >=1:
                dic["ticket"]-=1
                print("%s买到了票"%i)
            else:
                print("%s没买到票"%i)
        time.sleep(0.1)
        with open("D:lianxipython网络编程和并发编程d37\ticket", "w", encoding="utf-8") as f:
            json.dump(dic,f)
        lock.release()  # 还钥匙
    if __name__ == "__main__":
        lock=Lock()
        for i in range(5):
            # p=Process(target=show_ticket)
            # p.start()
            p1 = Process(target=buy_ticket,args=(i,lock))
            p1.start()
    View Code

    二.Semaphore 上n把锁

    from multiprocessing import Semaphore

    ktv实例

    import time
    from multiprocessing import Semaphore
    from multiprocessing import Process
    def go_ktv(i,sem):
        sem.acquire()
        print("%s进了ktv"%i)
        time.sleep(1)
        print("%s出了ktv"%i)
        sem.release()
    if __name__ == "__main__":
        sem=Semaphore(4)
        for i in range(10):
            p=Process(target=go_ktv,args=(i,sem))
            p.start()
    View Code

    三.Event 事件

    e=Event()全局定义了一个事件e
    创建时状态默认为False
    set和clear 分别修改一个事件的状态 True False
    is_set查看事件的状态 wait 根据事件的状态决定是否阻塞
    全局定义了一个“Flag”,如果“Flag”值为 False那么当程序执行 event.wait 方法时就会阻塞,
    如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
    from multiprocessing import Event
    e=Event()
    print(e.is_set())
    e.wait()
    print(666)
    #set.clear() ###
    e=Event()
    print(e.is_set())
    e.set() 将“Flag”设置为True
    e.wait()
    print(666)
    e.clear()  将“Flag”设置为False
    e.wait()  #不用e.wait 会正常显示
    print(777)
    View Code
    红绿灯实例
    from multiprocessing import Event,Process
    import time
    import random
    def car(e,i):
        if not e.is_set():
            print("33[31m%s在等待33[0m"%i)
            e.wait()
        print("33[32m%s在通过33[0m"%i)
    def light(e):
        while True:
           if e.is_set():
               e.clear()
               print("33[31m红灯亮33[0m")
           else:
               e.set()
               print("33[32m绿灯亮33[0m")
           time.sleep(2)
    if  __name__ == "__main__":
        e=Event()
        p=Process(target=light,args=(e,))
        p.start()
        for i in range(10):
            cars=Process(target=car,args=(e,i))
            cars.start()
            time.sleep(random.randint(1,3))
    View Code
     
  • 相关阅读:
    tiny4412 串口驱动分析八 --- log打印的几个阶段之内核启动阶段(printk tiny4412串口驱动的注册)
    tiny4412 串口驱动分析七 --- log打印的几个阶段之内核启动阶段(earlyprintk)
    tiny4412 串口驱动分析六 --- TTY驱动架构
    Android简单的利用SoundPool进行播放铃声的实例代码
    Android简单的利用MediaRecorder进行录音的实例代码
    tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码
    tiny4412 串口驱动分析四 --- 修改默认的串口输出
    tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压
    tiny4412 串口驱动分析二 --- printk的实现
    tiny4412 串口驱动分析一 --- u-boot中的串口驱动
  • 原文地址:https://www.cnblogs.com/zgf-666/p/8659921.html
Copyright © 2011-2022 走看看