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

结果:

posted @ 2019-12-16 19:19  手可摘星辰。  阅读(931)  评论(0编辑  收藏  举报