zoukankan      html  css  js  c++  java
  • Tornado 异步非阻塞


    1 装饰器 + Future 从而实现Tornado的异步非阻塞

        class AsyncHandler(tornado.web.RequestHandler):
         
            @gen.coroutine
            def get(self):
                future = Future()
                future.add_done_callback(self.doing)
                yield future
                # 或
                # tornado.ioloop.IOLoop.current().add_future(future,self.doing)
                # yield future
         
            def doing(self,*args, **kwargs):
                self.write('async')
                self.finish()
    

    当发送GET请求时,由于方法被@gen.coroutine装饰且yield 一个 Future对象,那么Tornado会等待,等待用户向future对象中放置数据或者发送信号,如果获取到数据或信号之后,就开始执行doing方法。

    异步非阻塞体现在当在Tornaod等待用户向future对象中放置数据时,还可以处理其他请求。

    注意:在等待用户向future对象中放置数据或信号时,此连接是不断开的。


    2 同步阻塞和异步非阻塞

        # 同步阻塞
    
        class SyncHandler(tornado.web.RequestHandler):
    
            def get(self):
                self.doing()
                self.write('sync')
    
        # 异步非阻塞
    
        class AsyncHandler(tornado.web.RequestHandler):
            @gen.coroutine
            def get(self):
                future = Future()
                tornado.ioloop.IOLoop.current().add_timeout(time.time() + 5, self.doing)
                yield future
    
    
            def doing(self, *args, **kwargs):
                self.write('async')
                self.finish()
    
            def doing(self):
                time.sleep(10)
    

    **3 httpclient类库用于发送Http请求,配合Tornado的异步非阻塞使用**
        import tornado.web
        from tornado import gen
        from tornado import httpclient
         
        # 方式一:
        class AsyncHandler(tornado.web.RequestHandler):
            @gen.coroutine
            def get(self, *args, **kwargs):
                print('进入')
                http = httpclient.AsyncHTTPClient()
                data = yield http.fetch("http://www.google.com")
                print('完事',data)
                self.finish('6666')
         
        # 方式二:
        # class AsyncHandler(tornado.web.RequestHandler):
        #     @gen.coroutine
        #     def get(self):
        #         print('进入')
        #         http = httpclient.AsyncHTTPClient()
        #         yield http.fetch("http://www.google.com", self.done)
        #
        #     def done(self, response):
        #         print('完事')
        #         self.finish('666')
         
         
         
        application = tornado.web.Application([
            (r"/async", AsyncHandler),
        ])
         
        if __name__ == "__main__":
            application.listen(8888)
            tornado.ioloop.IOLoop.instance().start()
  • 相关阅读:
    正则结合
    解决Linux下yum安装无法解析URL的问题
    Linux安装PHP和MySQL
    Windows安装PHP MongoDB扩展
    转】关于cgi、FastCGI、php-fpm、php-cgi
    Linux安装PHP MongoDB扩展
    mysql InnoDB引擎 共享表空间和独立表空间(转载)
    Mysql优化ibdata1大小
    Magento-设置产品显示的条数和默认条数
    MySql创建指定字符集的数据库
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8661101.html
Copyright © 2011-2022 走看看