python-tornado简单使用

2019-05-23  本文已影响0人  时尚灬IT男

首先附上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 使用多线程对性能来说是需要谨慎的,大量的计算量的情况可能会造成性能的下降。

上一篇下一篇

猜你喜欢

热点阅读