半同步半异步高性能网络编程
2015-07-27 10:52
531 查看
网络编程的模式分为3种:
1. nginx的全异步方式,使用epoll处理网络数据,对于请求的处理也完全是异步的。任何一个请求的处理如果花费了较长时间,那么nginx进程就会被处理操作阻塞,导致无法处理IO事件
2. 简单的一个连接一个线程方案,这种方案无法处理大量并发的连接,适用mysql这类连接数不多的场景。其中也有一些优化的做法,例如使用线程池避免不断的创建销毁线程。
3. 半同步半异步方式,启动一个IO线程使用epoll处理网络数据。当收到一个完整的请求包,把请求放到任务队列,有一个线程池不断的从队列里获取任务,同步处理,处理完之后再把响应数据由IO线程返回给用户。
其中半同步半异步方式广泛应用于服务器端编程,例如taobao开源的tbnet(tair,tfs都使用该库)。主要原因是nginx的全异步方式编写程序难度高,开发效率低,而一个连接一个线程方案无法支持大量的并发连接。半同步半异步方式则是开发效率与高性能之间的一个权衡,网络处理等有框架进行处理,开发者只关注业务逻辑的编写,只需同步处理请求即可,对于需要访问mysql等的应用非常方便。
对于tbnet这类的半同步半异步的网络库,使用者需要对多个类进行继承,override相关的handler来处理,一个非常简单的例子需要不少代码。
c++11标准出来之后,处理函数可以用匿名函数优雅的解决。handy是一个使用最新的c++11来简化网络编程的库,里面的例子非常简洁。
使用handy库进行半同步半异步编程的例子如下:
回调函数第一个参数为连接指针,第二个参数为消息。返回值为string,即消息的响应。
HSHA hsha(&base, 4) 创建一个半同步半异步服务器,线程池中线程数量为4.
这个例子的完整版本见:https://github.com/yedf/handy/blob/master/examples/hsha.cc
1. nginx的全异步方式,使用epoll处理网络数据,对于请求的处理也完全是异步的。任何一个请求的处理如果花费了较长时间,那么nginx进程就会被处理操作阻塞,导致无法处理IO事件
2. 简单的一个连接一个线程方案,这种方案无法处理大量并发的连接,适用mysql这类连接数不多的场景。其中也有一些优化的做法,例如使用线程池避免不断的创建销毁线程。
3. 半同步半异步方式,启动一个IO线程使用epoll处理网络数据。当收到一个完整的请求包,把请求放到任务队列,有一个线程池不断的从队列里获取任务,同步处理,处理完之后再把响应数据由IO线程返回给用户。
其中半同步半异步方式广泛应用于服务器端编程,例如taobao开源的tbnet(tair,tfs都使用该库)。主要原因是nginx的全异步方式编写程序难度高,开发效率低,而一个连接一个线程方案无法支持大量的并发连接。半同步半异步方式则是开发效率与高性能之间的一个权衡,网络处理等有框架进行处理,开发者只关注业务逻辑的编写,只需同步处理请求即可,对于需要访问mysql等的应用非常方便。
对于tbnet这类的半同步半异步的网络库,使用者需要对多个类进行继承,override相关的handler来处理,一个非常简单的例子需要不少代码。
c++11标准出来之后,处理函数可以用匿名函数优雅的解决。handy是一个使用最新的c++11来简化网络编程的库,里面的例子非常简洁。
使用handy库进行半同步半异步编程的例子如下:
#include <handy/handy.h> using namespace std; using namespace handy; int main(int argc, const char* argv[]) { EventBase base; HSHA hsha(&base, 4); int r = hsha.bind("", 99); exitif(r, "bind failed"); Signal::signal(SIGINT, [&]{ base.exit(); hsha.exit(); signal(SIGINT, SIG_DFL);}); hsha.onMsg(new LineCodec, [](const TcpConnPtr& con, const string& input){ int ms = rand() % 1000; info("processing a msg"); usleep(ms * 1000); return util::format("%s used %d ms", input.c_str(), ms); }); base.loop(); info("program exited"); }其中hsha.onMsg调用指定如何处理消息,第一个参数指定如何对消息进行编解码,这里传入的是一个行解码器,适用于telnet中的应用。第二个参数是个回调函数,指定如何处理消息。
回调函数第一个参数为连接指针,第二个参数为消息。返回值为string,即消息的响应。
HSHA hsha(&base, 4) 创建一个半同步半异步服务器,线程池中线程数量为4.
这个例子的完整版本见:https://github.com/yedf/handy/blob/master/examples/hsha.cc
相关文章推荐
- Android检测网络状态,判断当前网络是否可用
- 网络数据分类
- 分布式网络架构
- hdu 5294 - Tricks Device(2015 Multi-University Training Contest 1 )最短路+网络流
- ubuntu无法连接网络
- HDU 3549 基础网络流EK算法 Flow Problem
- HTTP协议详解
- 学习脚步--- HttpClient4.0
- http header 详解
- poj 1149 PIGS 【网络流经典建模】【求最大流】
- Android 模拟 Http GET 请求
- 使用xUtils-master中的HttpUtils进行断点续传
- 关于网络图片的采样与压缩保存
- android-async-http-master - 网络连接
- Android模拟Http POST 请求
- ※版本管理※=>☆SVN工具=>※解决地域麻烦※№→搭建自己的网络SVN (SourceForge 免费) [转]
- Oracle 应用和网络结构
- PRML5-神经网络(2)
- iOS监听网络变化
- cat 显示行号http://blog.sina.com.cn/s/blog_716844910100tfxv.html