原文转载自「刘悦的技术博客」v3u.cn/a_id_89python
在以前的一篇文章中,咱们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试,得出结论单台django在简单读库操做下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试mysql
这一次,咱们在相同的背景下,对三大框架中,以性能著称于世的Tornado进行并发测试,看看它的性能到底有多高。web
Tornado是一个用Python编写的异步HTTP服务器,同时也是一个web开发框架。sql
Tornado 优秀的大并发处理能力得益于它的 web server 从底层开始就本身实现了一整套基于 epoll 的单线程异步架构。数据库
那么,到底啥是特么的异步非阻塞呢?django
同步、异步编程差别:编程
你打电话问书店老板有没有《python开发》这本书,若是是同步通讯机制,书店老板会说,你稍等,”我查一下",而后开始查啊查,等查好了(多是5秒,也多是一天)告诉你结果(返回结果)。后端
而异步通讯机制,书店老板直接告诉你我查一下啊,查好了打电话给你,而后直接挂电话了(不返回结果)。而后查好了,他会主动打电话给你。在这里老板经过“回电”这种方式来回调。bash
阻塞与非阻塞的差别:服务器
仍是你打电话问书店老板有没有《python开发》这本书,你若是是阻塞式调用,你会一直把本身“挂起”,直到获得这本书有没有的结果
若是是非阻塞式调用,你无论老板有没有告诉你,你本身先一边去干别的了, 固然你也要偶尔过几分钟check一下老板有没有返回结果。
大部分Web应用都是阻塞性质的,也就是说当一个请求被处理时,这个进程就会被挂起直至请求完成,好比Django,而Tornado的思想是当咱们在等待结果的时候不阻塞,转而咱们给框架一个回调函数做为参数,让框架在收到结果的时候经过回调函数继续操做。这样,服务器就能够被解放去接受其余客户端的请求了。
首先,安装Tornado
pip3 install tornado
复制代码
编写main.py
import tornado.ioloop
import tornado.web
import pymysql
db = pymysql.Connection(host='127.0.0.1', database='md', user='root', password='mysql',charset='utf8')
class MainHandler(tornado.web.RequestHandler):
def initialize(self,db):
self.db = db
def get(self):
cur = db.cursor()
cur.execute("select id from news where id = 1 ")
res = cur.fetchone()
print(res)
self.write("Hello, world")
def make_app():
#路由
return tornado.web.Application([
(r"/", MainHandler,dict(db=db)),
])
if __name__ == "__main__":
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
复制代码
逻辑很简单,从数据库中读取一条数据,经过接口返回,服务监听8000端口
运行服务
python3 main.py
复制代码
Tornado不一样于Django,它自己是框架,同时也是一款服务器,因此不须要uwsgi这种网络模型服务。
开启压测命令:每秒255个请求持续一分钟
siege -c255 -t60S -v -b 127.0.0.1:8000
复制代码
能够看到,每秒处理近800个请求毫无压力,和Django根本就不是一个量级的,对于高并发问题,咱们一般用C10K这一律念来描述。C10K—— Concurrently handling ten thousandconnections,即并发10000个链接。对于单台服务器而言,根本没法承担,而采用多台服务器分布式又意味着高昂的成本,django并发数200左右,而Tornado能承担近800左右,无疑,在成本上节约了不少。
原文转载自「刘悦的技术博客」 v3u.cn/a_id_89