💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## Proactor模型 在 Reactor 模式中,Reactor 等待某个事件或者可应用或者操作的状态发生(比如文件描述符可读写,或者是 Socket 可读写)。 然后把这个事件传给事先注册的 Handler(事件处理函数或者回调函数),由后者来做实际的读写操作。 其中的读写操作都需要应用程序同步操作,所以 Reactor 是非阻塞同步网络模型。 如果把 I/O 操作改为异步,即交给操作系统来完成就能进一步提升性能,这就是异步网络模型 Proactor ![](https://img.kancloud.cn/24/ab/24ab9167c1548481bd8c9ff937ba6bb5_841x473.png) Proactor 是和异步 I/O 相关的,详细方案如下: 1)Proactor Initiator 创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 AsyOptProcessor(Asynchronous Operation Processor)注册到内核; 2)AsyOptProcessor 处理注册请求,并处理 I/O 操作; 3)AsyOptProcessor 完成 I/O 操作后通知 Proactor; 4)Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理; 5)Handler 完成业务处理 ### Proactor和Reactor的区别 1)Reactor 是在事件发生时就通知事先注册的事件(读写在应用程序线程中处理完成); 2)Proactor 是在事件发生时基于异步 I/O 完成读写操作(由内核完成),待 I/O 操作完成后才回调应用程序的处理器来进行业务处理。 理论上 Proactor 比 Reactor 效率更高,异步 I/O 更加充分发挥 DMA(Direct Memory Access,直接内存存取)的优势。 但是Proactor有如下缺点: 1)编程复杂性,由于异步操作流程的事件的初始化和事件完成在时间和空间上都是相互分离的,因此开发异步应用程序更加复杂。应用程序还可能因为反向的流控而变得更加难以 Debug; 2)内存使用,缓冲区在读或写操作的时间段内必须保持住,可能造成持续的不确定性,并且每个并发操作都要求有独立的缓存,相比 Reactor 模式,在 Socket 已经准备好读或写前,是不要求开辟缓存的; 3)操作系统支持,Windows 下通过 IOCP 实现了真正的异步 I/O,而在 Linux 系统下,Linux 2.6 才引入,目前异步 I/O 还不完善。 因此在 Linux下实现高并发网络编程都是以 Reactor 模型为主