当前位置: 首页 > news >正文

tornado异步请求的理解(转)

tornado异步请求的理解

http://www.kankanews.com/ICkengine/archives/88953.shtml 

官网第一段话:

Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long polling, WebSockets, and other applications that require a long-lived connection to each user.

翻译理解一下:Tornado是一个python实现的web框架,是异步网络请求包,起源于friendFeed; 是无阻塞网络I/O, Tornado可以很好处理成千上万的连接(C10K);处理轮询,webSockets和其他应用长连接等请求

个人理解异步网络等同于无阻塞网络

 

在官网中提供的一个Hello world的这个Demo中,是不支持异步的,只有在使用@tornado.web.asynchronous这个装饰器的时候才能算的上真正异步;参考博客

在blog中还有一个装饰@tornado.gen.coroutine这个装饰器是干什么的呢?? 查看tornado源码在gen.py中 
For example, the following asynchronous handler::

class AsyncHandler(RequestHandler):                                             
    @asynchronous                                                                                                                                       
    def get(self):                                                              
        http_client = AsyncHTTPClient()                                         
        http_client.fetch("http://example.com",                                 
                          callback=self.on_fetch)                               

    def on_fetch(self, response):                                               
        do_something_with_response(response)                                    
        self.render("template.html")
        self.finish()

从上面的代码可以看出在使用@asynchronous的时候,而且需要注意的是 Tornado默认在函数处理返回时关闭客户端的连接,但是当你使用@tornado.web.asynchonous装饰器时,Tornado永远不会自己关闭连接,需要显式的self.finish()关闭;每次需要一个显示命名一个callBack方法,为了省略写这个方法和 
self.finish()

就有如下的代码:

 

Future方式:

class GenAsyncHandler(RequestHandler):                                          
    @asynchronous                                                               
    @gen.coroutine                                                              
    def get(self):                                                              
        http_client = AsyncHTTPClient()                                         
        response = yield http_client.fetch("http://example.com")                
        do_something_with_response(response)                                    
        self.render("template.html")

 

Task方式:

class GenAsyncHandler2(RequestHandler):                                      
    @asynchronous                                                            
    @gen.coroutine                                                           
    def get(self):                                                           
        http_client = AsyncHTTPClient()                                      
        http_client.fetch("http://example.com", callback=(yield gen.Callback("key")) # 1                                                                                        
        response = yield gen.Wait("key")                                             # 2
        do_something_with_response(response)                                 
        self.render("template.html")

并且@gen.coroutineyield都是配对使用的

 

Task方式改良版:

细看gen.py注释文档我们会发现还有一种方式可以省略装饰器@asynchronous和简化#1和#2代码, 使用gen.Task

@gen.coroutine                                                               
def get(self):                                                               
     yield gen.Task(AsyncHTTPClient().fetch, "http://example.com")#替换上面的#1和#2

 

一次异步多个请求,适用于Future和Task版, 以下是Future版本

@gen.coroutine                                                               
def get(self):                                                               
    http_client = AsyncHTTPClient()                                          
    response1, response2 = yield [http_client.fetch(url1),                   
                                  http_client.fetch(url2)]

自己理解,仅供参考;


声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。

No tags for this post.

除非注明,本站文章均为原创或编译,转载请注明: 文章来自 KENGINE | Kankanews.com

转载于:https://www.cnblogs.com/DjangoBlog/p/4058948.html

相关文章:

  • P1250 种树
  • MySQL索引简介
  • Centos7 yum安装mysql(完整版)
  • 大话设计模式笔记(九)の外观模式
  • sort(桶排序+hash)
  • P1306 斐波那契公约数(ksm+结论)
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • “”(十六进制值 0x1D)是无效的字符
  • 每个开发人员现在应该下载的十种必备工具
  • 【海量视频】2013年上半年BPM厂商'K2'市场活动资料集锦
  • 2019牛客暑期多校训练营(第二场) - J - Go on Strike! - 前缀和预处理
  • OS的发展和分类
  • VBScript 内置函数
  • P1020 导弹拦截(nlogn求最长不下降子序列)
  • P1090 合并果子(哈弗曼树)
  • 《深入 React 技术栈》
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 07.Android之多媒体问题
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • laravel with 查询列表限制条数
  • PermissionScope Swift4 兼容问题
  • php的插入排序,通过双层for循环
  • SOFAMosn配置模型
  • Xmanager 远程桌面 CentOS 7
  • 多线程事务回滚
  • 观察者模式实现非直接耦合
  • 诡异!React stopPropagation失灵
  • 解析带emoji和链接的聊天系统消息
  • 前端攻城师
  • 前端性能优化——回流与重绘
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #pragma multi_compile #pragma shader_feature
  • #单片机(TB6600驱动42步进电机)
  • (27)4.8 习题课
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ZT)薛涌:谈贫说富
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)UDP基本编程步骤
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET学习教程二——.net基础定义+VS常用设置
  • @property括号内属性讲解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [].slice.call()将类数组转化为真正的数组
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android 数据通信] android cmwap接入点