一、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. 典型用途:

  1. 进程同步
  2. 控制执行顺序
  3. 安全通知进程开始任务
  4. 安全通知进程停止任务

四、常见使用场景

场景 说明
启动信号 主进程通知子进程开始
停止信号 优雅终止子进程
多进程同步 等待某个条件达成
循环控制 根据 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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐