由异步非阻塞引发的思考

来源:互联网 发布:网络英语培训中心 编辑:程序博客网 时间:2024/05/02 07:48

Tornado是一个用Python编写的异步HTTP服务器,同时也是一个web开发框架。作为Web框架,是一个轻量级的Web框架,其拥有异步非阻塞IO的处理方式。Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对比,结果最大浏览量超过第二名近40%。既然是http server又是python框架,它必然承担了类似nginx(协议与路由),fastcgi,mvc框架的角色,这种运行方式与http server + fastcgi + application相当于两种web机器的部署模式(在负载均衡后方)。

然后视野中出现了一句话:tornado实例是单线程的,联想起以前有人告诉我nginx也是单线程机制,瞬间觉得蒙圈了(nginx和tornado都可以不都是单实例模式,根据CPU个数的多少,可以派生多个实例运行,即fork对应数量的子进程,这是工具提供的特性,就是类似于work和master的工作模式,数量对应,可以免去进程调度带来的损耗),这两个工具都声称使用普通的服务器硬件就可以做到应对高并发。它还不像fpm那样管理一个进程池,那么单线程是怎么搞的定的?后续是得到的一知半解的解释。

把请求的耗时定位在IO操作(网络或者磁盘)而不是CPU时间(逻辑实现),如果一个请求在一个线程中要进行一个很长的IO操作,那么CPU等在那里,整个线程就阻塞了。后续的请求得不到响应,表现出来就是服务会很慢。

高并发情况下的响应慢问题就是著名的C10K问题,大致有两种方案,

1、为每个请求分配一个进程或者线程。从多实例的CPU消耗导致的效率下降和硬件扩展、长连接来考虑,这种方式都是是不可持续的。

2、利用linux系统IO操作提供的非阻塞方式,如epoll方式。CPU不再等待IO操作结束,而是去处理其他的请求。等到IO操作结束,得到通知,再去把之前的请求处理完。

从apache和nginx的发展历程也可见一二。Nginx 不同于 Apache2 的一点就是,Nginx采用单线程,非阻塞,异步 IO 的工作模型。Apache2 对于每一个请求,都会创建一个新进程或线程,会浪费很多内存和 CPU 时间,而 Nginx 使用操作系统提供的IO多路复用技术(epoll), 在一个线程中处理所有的请求。当一个 IO 操作开始的时候,Nginx 不会等待操作完成就会去处理下一个请求,等到某个 IO 操作完成后,Nginx 再回过头去处理这次 IO 的后续工作。

tornado和nginx一样都是这种单线程异步非阻塞的web服务器。

很多问题深入下去,都是linux底层,就像这个问题涉及IO操作poll、epoll等。网上搜索和书里看到的往往不深入,或者让人一知半解。大牛说到最后都会加上一句:看源码去…



两个不错的文档:

http://www.360doc.com/content/13/0522/18/1542811_287328391.shtml

http://wenku.baidu.com/link?url=moTAWPpt2iIiJhfz_Xi6G7dlZsh418xXH5mjcpmN9FQEvokyMzNyynDfvPkYEpjM9NRN1ZxGwlLxFoq-dbzxON6aU1rQt1A8makg2do0sha


0 0
原创粉丝点击