网络编程3---常用服务器编程模型
2016-02-23 21:25
507 查看
本文的内容主要总结自:《Linux多线程服务端编程---使用muduo C++网络库》,作者是陈硕
1.单线程服务器编程模型(Reactor模型)
non-blocking IO + IO multiplexing
(1)基本运作方式:
①event loop
②event-driven
③call-back
(2)伪代码示意
while(!done)
{
int timeout_ms = max(1000, getNextTimedCallback());
int retval = ::poll(fds, nfds, timeout_ms);
if(retval < 0)//出错
{
错误处理,回调用户的error handler
}
else if(retval == 0)//超时
{
处理到期的timers, 回调用户的timer handler
}
else//等待事件到达
{
处理IO事件, 回调用户的 IO event handler
}
}
在看过select poll epoll 以及libev以后上面的业务逻辑很好理解,不作赘述。
(3)本质困难
要求事件回调函数必须是非阻塞的,否则会干扰其它任务的监听与处理。
对于设计网络IO的请求响应式协议,它容易割裂业务逻辑,使其散布于多个回调函数之中,相对不容易理解和维护。
2.多线程服务器模型
one loop per thread + thread pool
(1)基本运作方式
①event loop 用作IO multiplexing, 配合non-blocking IO和定时器
②thread pool用来做计算,具体可以是任务队列或生产者消费者队列
(2)参考资料
①event loop可以看libev,它对于select,poll, epoll等多种IO multiplexing提供了统一的封装。
②thread pool可以看C++11新的标准库,在《C++并发编程实战》一书中,拥有任务队列的thread pool的参考实现。
1.单线程服务器编程模型(Reactor模型)
non-blocking IO + IO multiplexing
(1)基本运作方式:
①event loop
②event-driven
③call-back
(2)伪代码示意
while(!done)
{
int timeout_ms = max(1000, getNextTimedCallback());
int retval = ::poll(fds, nfds, timeout_ms);
if(retval < 0)//出错
{
错误处理,回调用户的error handler
}
else if(retval == 0)//超时
{
处理到期的timers, 回调用户的timer handler
}
else//等待事件到达
{
处理IO事件, 回调用户的 IO event handler
}
}
在看过select poll epoll 以及libev以后上面的业务逻辑很好理解,不作赘述。
(3)本质困难
要求事件回调函数必须是非阻塞的,否则会干扰其它任务的监听与处理。
对于设计网络IO的请求响应式协议,它容易割裂业务逻辑,使其散布于多个回调函数之中,相对不容易理解和维护。
2.多线程服务器模型
one loop per thread + thread pool
(1)基本运作方式
①event loop 用作IO multiplexing, 配合non-blocking IO和定时器
②thread pool用来做计算,具体可以是任务队列或生产者消费者队列
(2)参考资料
①event loop可以看libev,它对于select,poll, epoll等多种IO multiplexing提供了统一的封装。
②thread pool可以看C++11新的标准库,在《C++并发编程实战》一书中,拥有任务队列的thread pool的参考实现。
相关文章推荐
- 《python核心编程》读书笔记--第16章 网络编程
- https://projecteuler.net/problem=5
- B树、B-树、B+树、B*树的特点 及其性能比较 http://blog.csdn.net/panghuizl/article/details/6921631
- TCP协议与UDP协议
- 常见网络协议端口号整理
- 基于layer mobile手机端弹出框,询问框(PC端推荐layer和artDialog:http://download.csdn.net/download/cometwo/9437895)
- TCP TimeWait状态详解(比较全)
- Python3网络相关
- 基础网络学习记录
- C++之路进阶——网络流(晨跑)
- 网络编程_InetAddress_InetSocketAddress_URL_爬虫原理JAVA185-186
- 浏览器被劫持到http://hao.169x.cn/?v=108的解决办法
- HttpURLConnection请求
- Caffe下python环境的编译和使用draw_net.py绘制lenet网络结构图
- IOS使用AFNetworking进行网络通信
- 使用HttpClient进行远程接口测试
- 网络编程2---select poll epoll
- Apache2.4之httpd.conf配置详解
- 安卓Xutils3网络工具,注解工具,图片工具和日志工具的使用,以及对网络工具的封装
- java 反射调用类的方法 http://weiliuhong1.iteye.com/blog/1222381