• 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秒之间)

    结果:

  • 相关阅读:
    Linux I/O调度
    集群心跳机制
    如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)
    AVL树(平衡二叉树)
    二叉搜索树
    二叉树及树的遍历
    python实现基数排序
    python之迷宫BFS
    python之迷宫DFS
    python实现队列
  • 原文地址:https://www.cnblogs.com/wangdianchao/p/12050775.html
Copyright © 2020-2023  润新知