python复习--进程相关--Event()
一、Event 是什么
Event 是 multiprocessing 提供的一种 进程间同步机制。
本质是一个 共享状态的信号标志。
可以把 Event 理解为一个 全局开关:
- False → 未触发(默认状态)
- True → 已触发
多个进程可以同时监听这个状态。
二、Event 常用方法
Event 提供了 4 个核心方法:
1. set()
触发事件,将状态设置为 True
event.set()
2. clear()
重置事件状态为 False
event.clear()
3. is_set()
检查事件当前状态
event.is_set()
返回值:True/False
4. wait(timeout=None)
阻塞等待事件触发。
如果事件已经是 True,会立即返回。
event.wait()
设置超时时间:
event.wait(timeout=5)
三、Event + Process 能解决什么问题
Event 常用于 进程间通信(IPC)。
1. 典型用途:
- 进程同步
- 控制执行顺序
- 安全通知进程开始任务
- 安全通知进程停止任务
四、常见使用场景
| 场景 | 说明 |
|---|---|
| 启动信号 | 主进程通知子进程开始 |
| 停止信号 | 优雅终止子进程 |
| 多进程同步 | 等待某个条件达成 |
| 循环控制 | 根据 Event 状态运行 |
五、基本使用模式
1:主进程控制子进程启动
子进程等待 Event 信号。
示例
# ================= 标准库 =================
import time
from multiprocessing import Event, Process
def worker(start_event):
"""子进程任务"""
print("子进程:等待启动信号...")
# 阻塞等待事件触发
start_event.wait()
print("子进程:开始工作")
time.sleep(2)
print("子进程:工作完成")
if __name__ == "__main__":
# 创建 Event,默认状态是 False(未触发)
start_event = Event()
# 创建子进程
process = Process(target=worker, args=(start_event,))
process.start()
time.sleep(3)
print("主进程:发送启动信号")
# 触发事件
start_event.set()
process.join()
说明
wait() 会阻塞进程
set() 触发后,所有等待的进程都会继续执行
六、使用 Event 作为“停止信号”(最常见模式)
这是 实际项目中最常用的模式。
子进程循环执行任务,收到停止信号后退出。
示例
python
# ================= 标准库 =================
import time
from multiprocessing import Event, Process
def worker(stop_event):
"""子进程循环任务"""
while not stop_event.is_set():
print("子进程:正在运行...")
time.sleep(1)
print("子进程:收到停止信号,退出")
if __name__ == "__main__":
stop_event = Event()
process = Process(target=worker, args=(stop_event,))
process.start()
time.sleep(5)
print("主进程:通知停止")
stop_event.set()
process.join()
优点
相比 process.terminate():
- 更安全
- 可以释放资源
- 可以保存状态
七、多个进程共享一个 Event
一个 Event 可以同时控制多个进程。
类似 广播信号。
示例
# ================= 标准库 =================
import time
from multiprocessing import Event, Process
def worker(event, idx):
print(f"进程 {idx} 等待信号")
event.wait()
print(f"进程 {idx} 开始执行")
if __name__ == "__main__":
event = Event()
processes = []
for i in range(3):
process = Process(target=worker, args=(event, i))
process.start()
processes.append(process)
time.sleep(2)
print("主进程:统一发出信号")
event.set()
for process in processes:
process.join()
特点
一个 Event 可以唤醒 多个等待进程。
八、Event 与其他同步工具的区别
| 工具 | 适合场景 |
|---|---|
| Event | 状态控制(开 / 关信号) |
| Lock | 互斥访问共享资源 |
| Semaphore | 控制并发数量 |
| Queue | 进程间数据传递 |
| Condition | 复杂条件同步 |
Event 更像“红绿灯”,而不是锁。
九、Event 使用注意事项
1. 必须在主模块中创建
Windows / macOS 必须使用:
if __name__ == "__main__":
否则可能导致 子进程无限创建。
2. Event 不适合传递数据
Event 只表示:
True / False
如果需要传递数据,应使用:
- multiprocessing.Queue
- multiprocessing.Pipe
3. 避免永久阻塞
wait() 可以设置超时:
event.wait(timeout=5)
如果 5 秒没有触发,程序会继续执行。
十、总结
multiprocessing.Event 是 Python 多进程中 最简单的同步机制之一。
适合用于:
- 启动信号
- 停止信号
- 多进程同步
- 状态控制
可以把 Event 理解为:一个全局共享的信号开关。
与之关联的其它方法 python复习–进程相关–is_alive
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)