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
  • 相关阅读:
    还敢说你是程序员?一律师闲着没事写了个app,用户量600万
    cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机
    他曾被腾讯、百度、金山、遨游等联合封杀,如今他发展的却更好
    百度命不久矣?他为什么这么说?
    html实现下拉框、switch开关、复选框效果
    javascript拖拽滑动条
    行内元素默认间距的4种解决办法
    Html5 video用法详解
    npm装包时-S和-D的区别
    css3实现背景模糊的三种方式
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9512904.html
Copyright © 2011-2022 走看看