美文网首页
python-tornado简单使用

python-tornado简单使用

作者: 时尚灬IT男 | 来源:发表于2019-05-23 14:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:python-tornado简单使用

          本文链接:https://www.haomeiwen.com/subject/zugvzqtx.html