深刻理解Reactor和Proactor
2022-04-12 18:02:30 0 举报
AI智能生成
快速掌握Reactor和Proactor的多种线程/进程模型
作者其他创作
大纲/内容
Reactor
也叫Dispatcher模式
非阻塞同步网络模式,感知的是就绪可续写事件
核心部分
Reactor
负责
监听事件
分发事件
事件类型
连接事件
读写事件
处理资源池
负责
处理事件
四种方案
单Reactor 单进程/线程
Reactor对象通过select监听事件,收到事件后根据despatch进行分发
建立连接事件由Accepter对象处理,业务事件由Handler对象处理
缺点
无法充分利用多核CPU性能
Handler处理业务耗时较长时,造成响应延迟
成功案例
Redis
使用于业务处理非常快速的场景,不适用于计算密集型场景
单Reactor 多进程/线程
Handler对象不再负责业务处理,只负责数据的接收和发送。
业务处理交给子线程Processor对象来处理
单Reactor对象承担所有事件的监听和响应,容易成为高并发场景下的性能瓶颈
多Reactor 单进程/线程(实际中没有应用)
多Reactor 多进程/线程
主线程负责接收新连接,子线程负责完成后续的业务处理
成功案例
Netty,Memcache
Proactor
异步网络模式,感知的是已完成的可读写事件
工作模式
Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核
Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作
Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor
Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理
Handler 完成业务处理
可惜的是,在 Linux 下的异步 I/O 是不完善的, aio 系列函数是由 POSIX 定义的异步操作接口,不是真正的操作系统级别支持的,而是在用户空间模拟出来的异步,并且仅仅支持基于本地文件的 aio 异步操作,网络编程中的 socket 是不支持的,这也使得基于 Linux 的高性能网络程序都是使用 Reactor 方案。而 Windows 里实现了一套完整的支持 socket 的异步编程接口,这套接口就是 IOCP,是由操作系统级别实现的异步 I/O,真正意义上异步 I/O,因此在 Windows 里实现高性能网络程序可以使用效率更高的 Proactor 方案。
0 条评论
下一页