锁机制---信号机制----事件机制

Posted lynysy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁机制---信号机制----事件机制相关的知识,希望对你有一定的参考价值。

锁机制

  防止数据混乱 , 保护对进程的数据安全性

  锁涉及两个操作:  

    拿钥匙锁门  -------   不让别人进屋   (  其它 进程若想 进屋  要在外边等待 ,  等其出来后还回钥匙,才能进去  )

    还钥匙 开门 -------  让别人进屋 

  from  multiprocessing  import  Lock    先要导入模块

  l = Lock()     实例化一个锁机制  即对象锁     不用传参数     这把锁只有一把钥匙

  l.acquire()      锁门    拿走钥匙,   不让别人进屋

  l.release()      还回钥匙开门  ,   允许别人进屋 

补充一个模块  Value  

  num = Value( ‘ i ‘ ,  100 )     #  将数据 100 共享  在父进程和子进程中共享  都可以对其进行操作

 

 

  e.g    银行存取钱问题

    from   multiprocessing  import Proces , Value ,Lock

    import   time

    def  get_money( num , l ):    #  取钱  函数

      l.acquire()    #  锁门

      for  i in range(100):

        num.value -= 1

        print( num.value )

        time . sleep(0.01)

      l.release()   #  开门

    def  put_mooney( num, l ):    #  存钱  函数

      l.acquire()   #  锁门

      for i in range(100):

        num.value += 1

        print( num.value )

      l.relaese()   #  开门 

    if  __name__ == ‘ __main__ ‘ :

      num = Value( ‘ i ‘ , 100 )    #   实例化一个  共享的  数据

      l = Lock()   #  实例化一个 一把钥匙的 锁

      p = Process ( target = get_money , args = ( num , l ) )

      p.start()    #  开启  取钱  进程

      p1 = Process ( target = put_money , args = ( num, l ) )

      p1.start()    #  开启  存钱的进程

      p.join()   

      p1.join()     异步变同步

      print(num.value)      

  e.g    模拟 12306 抢票  机制

    from multiprocessing  imort  Process , Lock

    import  time

    def  check( i ):    # 查票  直接读取文件即可

      with  open ( ‘ 余票 ‘ )  as f:

        con = f.read()

        print( ‘ 第%s个人 查到还剩 %s张票 ‘ % ( i , con ))

    def  buy_check( i, l ):    #  买票   ,  先读  锁门  若有票再买  ,买完  文件中票数减一   再将剩余的  票数  写回文件中  

      l.acquire()    

      with open( ‘ 余票 ‘  )  as f:

        con = int (  f.read() )

        time.sleep( 0.1 )

      if  con > 0:

        print( ‘ 33[ 31m  第%s个人 买到票了  33[0m ‘ % i )

        con -= 1

      else :

        print( ‘ 33[32m 第%s个人没有买到票 33[0m ‘ % i )

        time. sleep(0.1)

      with  open( ‘ 余票 ‘ , ‘ w ‘  ) as  f:

        f.write(   str( con )  )

      l.release()

    if __name__ == ‘ __main__ ‘ :

      l = Lock()      #  实例化  一个  一把钥匙的锁

      for i in range(10):

        p_ch = Process( target = check , args = ( i +1 ,)  ) 

        p_ch . start()

      for i in range(10):

        p_buy = Process( target = buy_check , args = ( i +1 ,)  ) 

        p_buy . start()

信号机制

  一把锁 可以有 多把钥匙     比锁机制  多了一个计数器

  from multiprocessing  import   Semaphore 

  l = Semaphore( num )       初始化  一个  有  num把钥匙的  锁      int 类型

    num  是钥匙的  数量  是个计数器  

  l .acquire()     每多一个  num数量会减一  ,  当  num为零的时候 

                      处于阻塞状态    其他的 需要等待   还回一把钥匙才能进一个

  l.release()     每多一个  num数量会  加一 

 

  e.g  模拟发廊  

    

 

  

 

 

 

 

事件机制

  from  multiprocessing  import  Event

  e = Event()    

  e.wait()     判断  e.is_set()  是True 还是  False

  e.is_set()     当其为    True  的时候  处于非阻塞状态

            False  的时候     处于阻塞状态      一般  实例化事件后 默认是 False

  e.set()      将  e.is_set()   变为  True

  e.clear()    将   e.is_set()   变为  False

 

e.g

e.g  红绿灯

 

      

 

  

以上是关于锁机制---信号机制----事件机制的主要内容,如果未能解决你的问题,请参考以下文章

锁机制,信号机制,事件机制

锁机制,信号量机制,事件机制

进程之机制问题(锁,信号,事件)

Python下进程同步之互斥锁信号量事件机制 𪕽

Python下进程同步之互斥锁信号量事件机制 -- 2019-08-16 17:58:28

Python下进程同步之互斥锁信号量事件机制 -- 2019-08-16 18:05:40