zoukankan      html  css  js  c++  java
  • python_并发编程——事件

    1.事件

      :通过一个信号来控制多个进程同时执行或者阻塞。

        一个信号可以使所有的进程都进入阻塞状态,也可以控制所有的进程接触阻塞,一个事件被创建之后,默认是阻塞状态。

    from multiprocessing import Event
    
    e = Event() #创建事件对象
    print(e.is_set())   #查看一个事件的状态:默认是阻塞即False
    print(11111)
    e.wait()    #依据事件状态,来觉得是否阻塞
    print(22222)

    结果:

    2.解除阻塞:

    from multiprocessing import Event
    
    e = Event() #创建事件对象
    print(e.is_set())   #查看一个事件的状态:默认是阻塞即False
    print(11111)
    e.set()     #将事件的状态设置为True
    print(e.is_set())
    e.wait()    #依据事件状态,来觉得是否阻塞
    print(22222)

    结果:

    3.设置阻塞:

    from multiprocessing import Event
    
    e = Event() #创建事件对象
    print(e.is_set())   #查看一个事件的状态:默认是阻塞即False
    print(11111)
    e.set()     #将事件的状态设置为True
    print(e.is_set())
    e.wait()    #依据事件状态,来觉得是否阻塞
    print(22222)
    e.clear()       #将事件的状态改为False
    e.wait()
    print(e.is_set())
    print(33333)

    结果:

    应用:

    from multiprocessing import Process
    from multiprocessing import Event
    import time
    import random
    
    class Car(Process):
        def __init__(self,e,i):
            super().__init__()
            self.e = e
            self.i = i
        def run(self):
            if not self.e.is_set():
                print('{}在等红灯'.format(self.i))
                self.e.wait()   #阻塞,直到事件状态改变
            print('{}车通行'.format(self.i))
    
    class MyProcess(Process):
        def __init__(self,e):
            super().__init__()
            self.e = e
    
        def run(self):
            while True:
                if self.e.is_set():
                    self.e.clear()
                    print('红灯')
                else:
                    self.e.set()
                    print('绿灯')
                time.sleep(2)
    
    if __name__ == '__main__':
        e = Event()
        q1 = MyProcess(e)
        q1.start()
        for i in range(20):
            q2 = Car(e,i)
            q2.start()
            time.sleep(random.random()) #随机暂停时间(0-1秒之间)

    结果:

  • 相关阅读:
    收集珠子
    压缩变换(程序设计)
    动态规划-树上dp-1757. 搜集钻石
    动态规划-1620. 收集硬币
    动态规划-状态压缩-707. 最优账户结余
    图-1400. 图的费马点
    数学-快速幂
    计算几何-5361. 圆和矩形是否有重叠
    图-搜索-dfs-739. 24点
    图-dfs-连通分量-旋转变换-804. 不同岛屿的数量II
  • 原文地址:https://www.cnblogs.com/wangdianchao/p/12050775.html
Copyright © 2011-2022 走看看