zoukankan      html  css  js  c++  java
  • 进程之机制问题(锁,信号,事件)

    1.进程之锁机制

    • 问题引出,进程之间不能进行资源共享,容易造成数据混乱
    • def getmoney(num):
          for i in range(100):
              num += 1
      def setmoney(num):
          for i in range(100):
              num -= 1
      if __name__ == '__main__':
          num = 100
          p = Process(target=getmoney,args=(num,))
          p1 = Process(target=setmoney,args=(num,))
          p.start()
          p1.start()
          print(num)
      进程之间数据不共享
    • def getmoney(num):
          for i in range(100):
              num.value += 1
              time.sleep(0.01)
      def setmoney(num):
          for i in range(100):
              num.value -= 1
              time.sleep(0.01)
      if __name__ == '__main__':
          num = Value('i',100)
          p = Process(target=getmoney,args=(num,))
          p1 = Process(target=setmoney,args=(num,))
          #进程p和p1相对于主进程来说是同步执行
          #执行过程中会发生数据错乱
          p.start()
          p1.start()
          #同步主进程
          p.join()
          p1.join()
          print(num.value)
      #输出结果:93

      #为什么会发生数据错乱

    • 在计算机底层计算时,i+=1 其实是先tmp=i tmp+=1 i=tmp 所以可能tmp还没赋值给i,第二个进程就来了,直接覆盖了,所以会造成数据错乱!

    1.模块Lock:

    def getmoney(num,l):
        #为程序增加锁机制,不到释放锁的时候,程序会一直停留在其中
        l.acquire()
        for i in range(100):
            num.value += 1
            time.sleep(0.01)
        l.release()
    def setmoney(num,l):
        l.acquire()
        for i in range(100):
            num.value -= 1
            time.sleep(0.01)
        l.release()
    if __name__ == '__main__':
        l = Lock()
        num = Value('i',100)
        p = Process(target=getmoney,args=(num,l))
        p1 = Process(target=setmoney,args=(num,l))
        #进程p和p1相对于主进程来说是同步执行
        #执行过程中会发生数据错乱
        p.start()
        p1.start()
        #同步主进程
        p.join()
        p1.join()
        print(num.value)

    2.信号机制

    • semaphore模块:s = semaphore(5)同时控制五把钥匙
    • 可以同时控制多个信号量,然后释放一个,再执行下一个

    3.事件机制

    Event模块:e = Event():

    • e.set() #将is_set()设置为True
    • e.clear() #将Is_set()设置为False
    • e.wait() #当Is_set()为True时,为非阻塞,反之,为阻塞;
    e = Event()
    print(e.is_set())#默认为False
    e.set()     #将is_set设置为True,如果没有这句,遇到阻塞将不往下执行
    print(123)
    print(e.is_set()) #这为True,wait()才会执行
    e.wait()
    print(456)
    print(e.is_set()) #这也为True
    
    
    e.clear()#设置为False
    print(e.is_set())
    e.wait()#执行不了,程序阻塞在此
    print(555)
    
    #输出结果
    False
    123
    True
    456
    True
    False
  • 相关阅读:
    437. Path Sum III
    416. Partition Equal Subset Sum
    417. Pacific Atlantic Water Flow
    30.构建单机多容器环境-故障&31.构建单机多容器环境
    29.镜像容器与仓库
    【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
    【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
    【笔记目录2】ASP.NET Core分布式项目实战
    【笔记目录1】ASP.NET Core分布式项目实战
    技术牛人感悟
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9512904.html
Copyright © 2011-2022 走看看