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
     
  • 相关阅读:
    javascript中!=、!==、==、===操作符总结
    轮询、长轮询与Web Socket的前端实现
    C#中Enum用法小结
    浅谈Javascript 中几种克隆(clone)方式
    JS数组sort比较函数
    为Jquery类和Jquery对象扩展方法
    自定义滚动条mCustomScrollbar
    T-SQL 控制流语句
    sql case 用法总结
    Selenium2+python自动化19-单选框和复选框(radiobox、checkbox)【转载】
  • 原文地址:https://www.cnblogs.com/zgf-666/p/8659921.html
Copyright © 2011-2022 走看看