一 前言
我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。
后续文章会逐个介绍这几种方式,本文学习 Event 。
Python 多进程中 Event 是用来实现进程间同步通信的(当然多线程中也可以用 event )。事件event运行的机制是:全局定义了一个Flag,如果Flag值为 False,当程序执行event.wait()方法时就会阻塞,如果Flag值为True时,程序执行event.wait()方法时不会阻塞继续执行。
Python线程的事件提供如下几个方法
wait()方法:wait是否阻塞是看event对象内部的Flag的值。
set()方法:将Flag的值改成True。
clear()方法:将Flag的值改成False。
is_set()方法:判断当前的Flag的值。
代码中我们可以通过
e = Event() 或者 e = multiprocessing.Event()
创建一个全局的event对象,用于不同进程之间的通信。
举个?, 大家过马路都要经过红绿灯, 行人过马路和交通指示灯是两个不同的对象或者处理单元。我们可以把行人和红绿灯抽象为两个独立的进程,行人在绿灯的情况下通过马路,红灯时必须等待。红绿灯可以当做两个进程的通信机制event。
# encoding: utf-8
"""
import time
import random
from multiprocessing import Process
from multiprocessing import Event
def now():
return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def traffic_light(e): # 红绿灯
print now() + ' \033[31m红灯亮\033[0m' # Flag 默认是False
while True:
if e.is_set(): # 如果是绿灯
time.sleep(2) # 2秒后
print now() + ' \033[31m红灯亮\033[0m' # 转为红灯
e.clear() # 设置为False
else: # 如果是红灯
time.sleep(2) # 2秒后
print now() + ' \033[32m绿灯亮\033[0m' # 转为绿灯
e.set() # 设置为True
def people(e, i):
if not e.is_set():
print now() + ' people %s 在等待' % i
e.wait()
print now() +' people %s 通过了' % i
if __name__ == '__main__':
e = Event() # 默认为 False,红灯亮
p = Process(target=traffic_light, args=(e,)) # 红绿灯进程
p.daemon = True
p.start()
process_list = []
for i in range(6): # 6人过马路
time.sleep(random.randrange(0, 4, 2))
p = Process(target=people, args=(e, i))
p.start()
process_list.append(p)
for p in process_list:
p.join()
执行结果如下:
我们在多线程 和多进程中都可以利用event机制,进行子线程之间或者主进程和子线程之间的沟通协调机制。
-The End-
本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。