day38-进程-事件

#1、事件Event:以交通灯为例。可以控制所有进程等待或者运行。
from multiprocessing import Event
e = Event() #实例化一个事件,创建一个交通灯,默认是红灯,阻塞。
e.set()     #红变绿,非阻塞。可以控制所有进程通行。。
e.wait()    #停的时候看灯,上面代码是绿灯,绿灯行红灯停,所以wait是非阻塞。
e.clear()   #绿变红,阻塞。可以控制所有进程等待。
e.is_set()  #是否绿灯。True是绿灯,False就是红灯。

#2、Event里面有一个标志flag,当e = Event()刚创建的时候,flag=False,阻塞,这个时候,e.is_set()也是等于False,阻塞。
#e.set()让flag变成非阻塞,s.clear()让flag变成阻塞。
#e.wait() 当flag=True,非阻塞;当flag=False,阻塞。

#3、
from multiprocessing import Process
from multiprocessing import Event
import time
import random
def traffic_light(e):  #红绿灯
    while True:
        if e.is_set():      #如果是绿灯,3秒后变红灯。
            time.sleep(3)
            print('变红灯')
            e.clear()       #变红灯。
        else:
            time.sleep(3)
            print('变绿灯')
            e.set()         #变绿灯。

def car(i,e):
    e.wait()               #停下来看一下灯,如果是绿灯,就是不阻塞,接着执行下面的代码,否则红灯阻塞,不执行下面代码。
    print('车%s通过'%i)

if __name__ == '__main__':
    e = Event()             #创建一个红绿灯。
    tra_p = Process(target=traffic_light,args=(e,)) #创建红绿灯转换的进程。
    tra_p.start()
    for i in range(100):   #假设有100辆车通过红绿灯。
        if i%6 == 0: #每6辆车会随机等1至3秒,如果每6辆车都是等待1秒,那么在3秒的绿灯时间里,可以通过18辆车。
            time.sleep(random.randint(1,3))
        car_p = Process(target=car,args=(i,e))
        car_p.start()

你可能感兴趣的:(day38-进程-事件)