首先附上tornado官方网站 tornado (看官网最全)
安装tornado:
pip install tornado
先从hello world开始
import tornado.ioloop
import tornado.web
#定义处理类型
class MainHandler(tornado.web.RequestHandler):
#添加一个处理get请求方式的方法
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app() #创建一个应用对象
app.listen(8888) # 设置端口
tornado.ioloop.IOLoop.current().start() #启动web程序,开始监听端口的连接
Tornado的优势
1.轻量级web框架
2.异步非阻塞IO处理方式
3.出色的抗负载能力
4.优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
5.WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器
Tornado 代码解析
tornado.web:tornado的基础web框架
RequestHandler:封装对请求处理的所有信息和处理方法
get/post/..:封装对应的请求方式
write():封装响应信息,写响应信息的一个方法
tornado.ioloop:核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。
current()返回当前线程的IOLoop实例对象
start()启动IOLoop实力对象的IO循环,开启监听
程序调试之debug配置
#自动重启+取消缓存模板+取消缓存静态文件+提供追踪信息tornado.web.Application([(..)], debug=True)注:开发之初可以设置debug=True方便调试,开发完毕改为False.
get方式传递参数
get_query_arguments(name,default=_ARG_DEFAULT,strip=True)
get_query_argument(name ,strip=True)
post方式传递参数
get_body_arguments(name, default=_ARG_DEFAULT,strip=True)
get_body_argument(name ,strip=True)
request/json
# -*- coding:utf-8 -*-
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
class IndexHandler(RequestHandler):
def get(self):
print self.request
json_str = {"username": "admin", "password": "123123"}
self.write(json.dumps(json_str))
if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
app.listen(8000)
IOLoop.current().start()
异步非阻塞
import time
import logging
import tornado.ioloop
import tornado.web
import tornado.options
from tornado import gen
from concurrent.futures import ThreadPoolExecutor
class NoBlockingHnadler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
print(11111111111)
yield gen.sleep(10)
self.write('Blocking Request')
class BlockingHnadler(tornado.web.RequestHandler):
def get(self):
print(11111111111)
time.sleep(10)
self.write('Blocking Request')
def make_app():
return tornado.web.Application([
(r"/block", BlockingHnadler),
(r"/noblock", NoBlockingHnadler),
], autoreload=True)
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
这里要强调的是:这里的异步非阻塞是针对另一请求来说的,本次的请求该是阻塞的仍然是阻塞的。
多进程运行
coroutine 是给Non-blocking 函数提供异步协程的方式运行, ThreadPoolExecutor 则可以给blocking 的函数提供异步的方式运行,但是由于是多线程的,Python 使用多线程对性能来说是需要谨慎的,大量的计算量的情况可能会造成性能的下降。
import tornado.web
from tornado import gen
from tornado.httpserver import HTTPServer
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write('index')
@gen.coroutine
def doing():
yield gen.sleep(10)
raise gen.Return('Non-Blocking')
class NonBlockingHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
result = yield doing()
self.write(result)
def make_app():
return tornado.web.Application([
(r"/index", IndexHandler),
(r"/nonblocking", NonBlockingHandler),
])
def main():
app = make_app()
server = HTTPServer(app)
server.bind(8888)
server.start(2) # 设置启动多少个进程
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
main()
coroutine 是给Non-blocking 函数提供异步协程的方式运行, ThreadPoolExecutor 则可以给blocking 的函数提供异步的方式运行,但是由于是多线程的,Python 使用多线程对性能来说是需要谨慎的,大量的计算量的情况可能会造成性能的下降。
网友评论