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

锁机制

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

  锁涉及两个操作:

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

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

  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  红绿灯

      

  

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

时间: 2024-10-09 22:04:14

锁机制---信号机制----事件机制的相关文章

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

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

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

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

Qt事件机制---信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。

Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事件: 按键按下和松开. 鼠标事件: 鼠标移动,鼠标按键的按下和松开. 拖放事件: 用鼠标进行拖放. 滚轮事件: 鼠标滚轮滚动. 绘屏事件: 重绘屏幕的某些部分. 定时事件: 定时器到时. 焦点事件: 键盘焦点移动. 进入和离开事件: 鼠标移入widget之内,或是移出. 移动事件: widget的位

Unity事件处理机制与NGUI事件机制

1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个手指触控是通过Input.touches数据结构描述的: fingerId 手指索引 The unique index for a touch. 触摸的唯一索引. position 位置 The screen position of the touch. 触摸屏幕的位置. deltaPosition

Qt事件机制概览

Qt事件机制概览 Qt事件机制概览 消息循环 Qt事件循环 简介 QEventLoop 跨线程的信号和槽与事件循环 模态窗口 Native widget or Alien widget 创建Native widget 创建QApplication的message-only窗口 派发事件的公共基础方法 source code QApplication的创建过程 QWidget native QWidget 的创建过程 普通native widget回调过程 QApplication的message

QT开发(十三)——QT信号与槽机制

QT开发(十三)--QT信号与槽机制 一.QT消息模型 QT封装了具体操作系统的消息机制,遵循经典的GUI消息驱动事件模型. QT定义了与操作系统消息相关的自己的概念,即信号与槽. 信号signal是由操作系统产生的消息. 槽slot是程序中的消息处理函数. connect将系统消息绑定到消息处理函数. 信号到槽的连接必须发生在两个QT对象间. bool QObject::connect ( const QObject * sender, //发生对象 const char * signal,

详解C#事件机制

C#中的委托事件机制是这种语言的一大亮点,以一种更加安全和高效的方式可以实现类似C语言中的函数指针,Qt中的信号槽机制和委托事件机制在实际运用中颇为相似,但是,C#使用上更加方便.下面,我先贴个图来展示一个事件机制的原理: 上述Publisher类的作用就是定义委托.定义事件以及定义触发事件的方法: Subscriber类的作用注册事件,并且定义具体的事件处理方法.(好像Subscriber类不需要注册事件,注册事件是在运行的模块进行) 这种思想本人以为就是:还没想好怎么做就先搭个框架(写个函数

PHP event 事件机制

PHP event 事件机制 <?php /* * PHP 事件机制 */ class baseClass{ private $_e; public function __set($name,$value){ if( strncasecmp($name,"on",2) === 0 ){ if(!isset($this->_e[$name])) $this->_e[$name] = array(); return array_push($this->_e[$nam

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

在多进程运行处理数据时,会出现争夺资源到时数据混乱的现象,为了避免数据混乱,这里就引入了锁机制: 锁机制:引入Lock模块,l = Lock()在子进程中,l.acquire()表示取到钥匙,锁上门进行数据处理;l.release()表示归还钥匙打开门,让下一个进程进行操作. 信号机制:能够将一把锁配置多把钥匙,能够让多个进程同时进行操作.导入Semaphore模块,sem = Semaphore(n)中的n是int型,表示可以同时进行操作的子程序数. 事件机制:导入Event模块,e.is_s