码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-21 18:22:59      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:else   set   读取   行操作   银行   传参   for   semaphore   事件机制   

锁机制

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

  锁涉及两个操作:  

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

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

  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( ‘ \033[ 31m  第%s个人 买到票了  \033[0m ‘ % i )

        con -= 1

      else :

        print( ‘ \033[32m 第%s个人没有买到票 \033[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  红绿灯

 

      

 

  

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

标签:else   set   读取   行操作   银行   传参   for   semaphore   事件机制   

原文地址:https://www.cnblogs.com/lynysy/p/9512477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!