反应器Reactor和主动器Proactor的区别
参考书籍《C++11工程级应用》第16章
事件驱动设计在服务器开发中非常流行,其中常见的有两种:反应器(Reactor)和主动器(Proactor)
1. 反应器
反应器需要应用程序先注册事件处理器,然后启动反应器的事件循环,不断地检查是否有就绪地I/O事件,当有就绪事件时,同步事件多路分解器将会返回到反应器,反应器会将事件分发给多个句柄的回调函数以处理这些事件。
反应器的一个特点是,具体的处理程序并不调用反应器,而是由反应器来通知处理程序去处理事件,这种方式也被称为“控制反转”,又称为“好莱坞原则”。
反应器模式大概的流程如下:
1)应用程序在反应器上注册具体事件处理器,处理器提供内部句柄给反应器。
2)在注册之后,应用程序开始启动反应器事件循环。反应器将通过select等待发生在句柄集上的就绪事件。
3)当一个或多个句柄变成就绪状态时(比如某个socket读就绪了),反应器将通知注册的事件处理器。
4)事件处理器处理就绪事件,完成用户请求。
反应器模式使用起来相对直观,但它不能同时支持大量的客户请求或者耗时过长的请求,因为它串行化了所有的事件处理过程。而Proactor在这方面做了改进。
2. 主动器
1)应用程序需要定义一个异步执行的操作,例如,socket的异步读/写。
2)执行异步操作,异步事件处理器将异步请求交给操作系统就返回了,让操作系统去完成具体的操作,操作系统在完成操作后,会将完成事件放入一个完成事件队列。
3)异步事件分离器会检测完成事件,若检测到完成事件,则从完成事件队列中取出完成事件,并通知应用程序注册的完成事件处理函数去处理。
4)完成事件处理函数处理异步操作的结果。
主动器和反应器的主要区别就是,主动器中,真正的读写是操作系统完成的。
具体介绍可以看这本书《面向模式的软件架构:卷2》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构