高效并发模式--领导者/追随者模式
并发模式是指I/O处理单元和多个逻辑单元之间的协调完成任务的方法。
并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动。
领导者/追随者模式
领导者/追随者模式是多个工作线程轮流获得事件源集合,轮流监听、分发并处理事件的一种模式。
领导者线程:在任意时间点,程序都仅有一个领导者线程。负责监听I/O事件。
追随者线程:当前时间点,除领导者线程之外的所有线程都是追随者,都休眠在线程池中等待成为新的领导者。
当前的领导者如果检测到I/O事件:
- 从线程池中推线新的领导者;
- 旧的领导者去处理I/O事件;
- 新的领导者等待新的I/O事件。
![领导者-追随者模式.png](https://i.loli.net/2020/12/22/5NeaoEdxAW4THrX.png)
组件
![领导者-追随者模式的组件.png](https://i.loli.net/2020/12/22/JFtIr9V6qHRlj2E.png)
-
句柄集(HandleSet)
句柄(Handle)用于表示I/O资源,Linux下通常是文件描述符。句柄集管理从多句柄。
wait_for_event()
:监听句柄集中的所有句柄的I/O事件,并将就绪事件通知给领导者进程。register_handle()
:绑定句柄和事件处理器。unregister_handle()
:解绑句柄和事件处理器。
-
线程集(ThreadSet)
所有工作线程,包括领导者线程和追随者线程。线程集主要负责线程之间的同步,以及推选新的领导者。线程状态包括:
- Leader:领导者身份,等待句柄集上的I/O事件。当检测到新的I/O事件,可以推选新的领导者,本线程转为Processing处理事件,也可能指定其他追溯者来处理事件;
- Processing:正在处理事件;
- Follower:追随者身份,等待成为新的领导者,也可能被当前领导者指定来处理新的任务。
-
事件处理器(EventHandler)和具体事件处理器(ConcreteEventHandler)
事件处理器通常包含一个或多个回调函数
handle_event
。这些回调函数用于处理事件对应的业务逻辑。
优势&缺陷
优势:
- 不需要在线程之间传递任何额外的数据(领导者自己监听I/O事件并处理请求);
- 线程之间无须同步队请求队列的访问(对比半同步/半反应堆模式)。
缺陷:
- 仅支持一个事件源集合
- 无法让每个工作线程独立地管理多个客户连接