py并发_Event笔记

Event

Event实际上描述的是一种同步的处理事件,可以简单的理解为,不同的进程之间可以利用一些特殊的处理来等待其它进程处理完毕,例如:现在你肚子饿了,肯定需要进行吃饭,那么既然肚子饿吃饭就必须等待饭做好了才可以吃。把做饭作为一个进程,而吃饭作为另外一个进程,吃饭的进程一定要等待做饭的进程执行完毕后才可以继续执行。

在Event类同步处理时,多个进程将拥有一个Event实例,当调用wait()方法时将进入到阻塞状态,同时会设置阻塞标记为”False”(待阻塞标记为“True”后才会解除阻塞状态),此时另外一个进程可以继续工作,并且通过set()方法将阻塞标记设置为”True”,这样之前阻塞的进程就会继续执行。

Event象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为Falsewait()方法阻塞,直到标志为True。该标志初始为False

方法:

  • is_set()
    当且仅当内部标志为True时返回True

  • set()
    将内部标志设置为True。所有等待它成为True的线程都被唤醒。当标志保持在True的状态时,线程调用wait()是不会阻塞的。

  • clear()
    将内部标志重置为False。随后,调用wait()的线程将阻塞,直到另一个线程调用set()将内部标志重新设置为True

  • wait(timeout=None)
    阻塞直到内部标志为真。如果内部标志在wait()方法调用时为True,则立即返回。否则,则阻塞,直到另一个线程调用set()将标志设置为True,或发生超时。
    该方法总是返回True,除非设置了timeout并发生超时。

测试

食客和餐厅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import multiprocessing,time
def restaurant_handle(event): # 餐厅的处理进程
print("1、【餐厅】为食客安排座位,并在一旁等待食客点餐...")
time.sleep(1) # 模拟一个食客点餐的时间损耗
event.set() # 解除阻塞状态
event.clear() # 清除已有的状态
event.wait() # 等待食客后续处理
print("3、【餐厅】厨师接到菜单,开始烹饪美食...")
time.sleep(2) # 餐厅大厨开始准备食材并做菜
event.set() # 解除食客等待
event.clear() # 清除已有的状态
def diners_handle(event): # 食客处理进程
event.wait() # 等待之前的第一步完成,进入到阻塞状态
print("2、【食客】食客看完菜单,选好了自己心仪的美食...")
time.sleep(1) # 食客的时间消耗
event.set() # 解除阻塞状态,代表食客完成了选菜
event.clear() # 之前的状态清空
event.wait() # 继续等待后续的处理步骤
print("4、【食客】享用丰盛美食...")
def main(): # 主函数
event = multiprocessing.Event() # 定义一个Event同步处理
restaurant_process = multiprocessing.Process(
target=restaurant_handle,
args=(event,),
name="餐厅服务进程")
diner_process = multiprocessing.Process(
target=diners_handle,
args=(event,),
name="食客进程")
restaurant_process.start()
diner_process.start()
if __name__ == "__main__": #判断程序执行名称
main()

1、【餐厅】为食客安排座位,并在一旁等待食客点餐…
2、【食客】食客看完菜单,选好了自己心仪的美食…
3、【餐厅】厨师接到菜单,开始烹饪美食…
4、【食客】享用丰盛美食…

进程已结束,退出代码0


py并发_Event笔记
https://blog.wangxk.cc/2020/02/01/py并发-Event笔记/
作者
Mike
发布于
2020年2月1日
许可协议