tornado 第一篇

 一:异步和非阻塞IO

  实时的web特性通常需要每个用户一个大部分时间,在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大

  tornado使用啦一种单线程事件循环的方式,这意味着所有的应用代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的

  1,阻塞

    一个函数在等到返回值等都是阻塞的,

    一个函数可以在某些方面阻塞而在其他方面不阻塞,举例说明。tornado,httpclient在默认设置下讲阻塞与DNS解析,但是在其他网络请求时不会阻塞(为了减轻这种影响,可以用ThreadeResolver 或通过正确配置libcurl使用tornado.curl_htpclient),在Tornado的上下文中我们通常讨论网络I/O上下文阻塞,虽然各种阻塞已经被最小化啦

  2,异步

    一个异步函数在在它结束前就已经返回啦,而且通常会在程序中触发一些动作然后在后头执行一些任务,这里有几种类型的异步接口

    1,回调函数

    2,返回一个占位符(Future,Promise,Deferred)

    3,传送一个队列

    4,回调注册

    一个简单的同步异步函数

    

from tornado.httpclient import HTTPClient
from tornado.concurrent import Future
def synchronous_fetch(url):http_client = HTTPClient()def handle_response(response):callback(response.body)http_client.fetch(url,callbace=handle_response)

    在一次通过Future替代回调函数

    

def async_fetch_future(url):http_client=HTTPClient()my_future=Future()fetch_future=http_client.fetch(url)fetch_future.add_done_callback(lambda f:my_future.set_result(f.result))return my_future

    原始的Future是很复杂的,但是Futures是tornado中推荐使用的一种做法,因为他有两个优势

    错误处理是通过Future.result 函数可以简单抛出一个异常,还有就是携程兼容比较好

   

rom tornado import gen@gen.coroutine
def fetch_coroutine(url):http_client = AsyncHTTPClient()response = yield http_client.fetch(url)raise gen.Return(response.body)

    语句 raise gen.Return(response.body) 在 Python 2 中是人为设定的, 因为生成器不允许又返回值. 为了克服这个问题, Tornado 协程抛出了一个叫做 Return 的特殊异常. 协程将会像返回一个值一样处理这个异常.在 Python 3.3+ 中, return response.body 将会达到同样的效果.

 

二:协程

  tornado中推荐协程来编写异步代码,协程使用python中关键件yield替换链式回调实现挂起和继续协程的执行(像在gevent中使用轻量级线程合作的方法有时也称作为协程,但是在Tornado中所有的协程使用异步函数来实现明确的上下文切换)

  看下协程的代码

from tornado import gen
from tornado import HTTPClient
def fetch_coroutie(url):http_client=AsyncHTTPClient() 
  respone=yield http_client.fetch(url)

  # raise gen.Return(respone.body)
  
  return respone.body

 

   python3.5 async和awiat 

   python3.5 引入啦async和await 从tornado4.3开始,在协程基础上你可以使用这个来代替yield,简单的通过使用async def foo()来替代 @gen.coroutine 装饰器,用await来代替yield,可以看下下面的例子

  

async def fetch_coroutine(url):http_client = AsyncHTTPClient()response = await http_client.fetch(url)return response.body

    一个含有yield的函数时是一个生成器,所有的生成器都是异步的,调用它时将会返回一个对象而不是将函数运行完成,@gen.coroutine修饰器通过yeild表达式通过产生一个Future对象和生成器进行通信

    可以看下一个协程装饰器内部循环的简单版本

    

def run(self):future=self.gen.send(self.next)def callback(f):self.next=f.result()self.run()future.add_done_callback(callback)

    

有时你并不想等待一个协程的返回值. 在这种情况下我们推荐你使用 IOLoop.spawn_callback, 这意味着 IOLoop 负责调用. 如果它失败了, IOLoop 会在日志中记录调用栈:  同时注意spawn_callback调用的函数,也必须是协程函数

# The IOLoop will catch the exception and print a stack trace in
# the logs. Note that this doesn't look like a normal call, since
# we pass the function object to be called by the IOLoop.
IOLoop.current().spawn_callback(divide, 1, 0)


  协程模式
   1,结合callbacks
      
为了使用回调来代替Future与异步代码进行交互,将这个调用装在task中,这将会在你生成的Future对象中添加一个回调参数
      
@gen.coroutine
def call_task():yield gen.Task(some_function, other_args)#把yeild换成gen_Task  

     2,调用阻塞函数

      在协程中调用阻塞函数的最简单方法是使用ThreadPoolExecutor  这将返回与协程兼容的Futures

      

thread_pool = ThreadPoolExecutor(4)@gen.coroutine
def call_blocking():yield thread_pool.submit(blocking_func, args)

      3,并行

        协程装饰器识别列表或者字典中的Futures,并且并行等待这些Fuures

    

@gen.coroutine
def parallel_fetch(url1,url2):resp1,resp2 = yield [http_client.fetch(url1),http_client.fetch(url2)]@gen.coroutine
def parallel_fetch_dict(urls):responses = yield {url: http_client.fetch(url)for url in urls}

      4,交叉存取技术(项目一般用到比较多)

        有时保存一个Future比立刻yield它更有用,你可以等待它之前执行其他操作

        

def get(self):fetch_future = self.fetch_next_chunk()while True:chunk = yield fetch_futureif chunk is None:breakself.write(chunk)fetch_future= self.fetch_next_chunk()yield self.flush()

      5,循环

        因为python无法使用forwhile循环yield迭代器,并且捕获yield的返回结果,相反,你需要将循环和访问结果区分开来,

      

import motor
db = motor.MotorClient().test@gen.coroutine
def loop_example(collection):cursor = db.collection.find()while (yield cursor.fetch_next):doc = cursor.next_object()

      6,在后台运行

@gen.coroutine
def minute_loop():while True:yield do_something()yield gen.sleep(60)# Coroutines that loop forever are generally started with
# spawn_callback().
IOLoop.current().spawn_callback(minute_loop)

 

 

更过内容可以参考:http://tornado-zh-cn.readthedocs.io/zh_CN/latest/guide/coroutines.html#python-3-5-async-await

        

 

    

  

 

转载于:https://www.cnblogs.com/1204guo/p/8533421.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最近找工作面的面试题目汇总(一)

网址:http://www.cnblogs.com/renyiqiu/p/6504839.html 目录 1.抽象类的介绍,抽象类里的虚函数和抽象函数 参考文档抽象类特征抽象方法特征2.虚函数和抽象方法 参考文档虚方法的特点虚方法(virtual)和抽象方法(abstract)的区别3.静态类和静态类成员 参考…

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包、foreach。为了便于理解,我重新组织了语言,以倒叙结构行文。先给大家提炼出一个C#题:观察for、foreach闭包的差异左边输出…

C#对window 硬件类操作,ManagementObjectSearcher

原文转载:http://blog.csdn.net/da_keng/article/details/50589145 纯属转载,复制过来方便编程时寻找。感谢作者:I-Awakening复制前补充: 在刚学C#,用ManagementObjectSearcher 竟然不能解析到头文件,需要手…

2018第51周日

从人们开始用电脑开始就面临着文件版本控制的问题,从最原始的同一个文档多个不同命名表示版本到使用本地的文件版本管理,到后面集中式版本管理如2000年的SVN,到再后来的分布式的版本控制系统,如2005年的Git。到现在用的最多的版本…

twitter批量取消关注_如何在Twitter上取消阻止“潜在敏感内容”

twitter批量取消关注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …

mysql数值类型总结及常用函数

最近在学习下,总结一下mysql数值类型; mysql字符类型分: 1、整数类型: 字节 值范围 INTERGER 1 -127-128 SMALLINT 2 MEDIUMINT…

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明。用过Bootstrap的同学都会被其复杂的类名标签折磨过&#xff0c;例如一个简单的按键样式&#xff0c;不论颜色或是大小&#xff0c;都需要btn-前缀声明&#xff1a; <button type"button" class"btn btn…

skype自动回复_如何在Windows 10上阻止Skype自动启动

skype自动回复Microsoft微软The Skype app included with Windows 10 now has a notification area icon. That’s great, but what if you never use Skype and don’t want it starting every time you sign in? Here’s how to get rid of it. Windows 10随附的Skype应用程…

Vue 组件实例属性的使用

前言 因为最近面试了二、三十个人&#xff0c;发现大部分都还是只是停留在 Vue 文档的教程。有部分连教程这部分的文档也没看全。所以稍微写一点&#xff0c;让新上手的 Vuer 多了解 Vue 文档的其他更需要关注的点。 因为 Vue 文档已经是个很成熟的文档&#xff0c;并且实现的 …

C# 读取硬盘信息类

在编写工具检查硬盘信息时&#xff0c;总结常用到的类&#xff1a; Win32_DiskDrive 这个用了检查整个硬盘的信息&#xff0c;如果电脑只有一个硬盘&#xff0c;那只显示一条信息。参考如下代码&#xff0c;AddTextBox为自定义显示函数。&#xff08;MSDN class 查询&#xff1…

95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!

hi&#xff0c;这里是桑小榆。最近和一个伙伴oncall了很久&#xff0c;对我的文章以及思想转变产生了很大的共鸣&#xff0c;她向我分享了一些职场经历还有成长经历等&#xff0c;她的这些经历也让我引发了一定的思考。光光&#xff0c;最近刚升任了部门主管&#xff0c;对于当…

PHP:6种GET和POST请求发送方法

在i94web博客中&#xff0c;我试过了畅言和多说两种社会化评论框&#xff0c;后来还是抛弃了畅言&#xff0c;不安全。 无论是畅言还是多说&#xff0c;我都需要从远程抓取文章的评论数&#xff0c;然后存入本地数据库。对于多说&#xff0c;请求的格式如下&#xff1a; // 获取…

解决Ubuntu 16.04下提示boot分区空间不足的办法

原文地址: http://www.jb51.net/article/106976.htm   https://www.linuxidc.com/Linux/2015-09/123227.htm 因为linux内核一直在更新&#xff0c;更新后&#xff0c;旧的内核就不在使用&#xff0c;但旧的内核文件还在boot里面&#xff0c;占据着空间&#xff0c;更新几次过…

3d镜头 适配_您是否应该将镜头适配器与无反光镜相机一起使用?

3d镜头 适配Canon佳能Mirrorless cameras aren’t the future, they’re the present. If you’re switching from an older DSLR, though, the obvious thing to do is just buy an adapter so you can keep using your old gear. 无反光镜相机不是未来&#xff0c;而是现在。…

C#弹窗提示并自动关闭方法

刚学C#不久&#xff0c;就写个工具&#xff0c;总结写一个简便自定义提示窗口方法&#xff0c;并自动关闭。 1.在项目添加windows form&#xff08;非user control&#xff09;&#xff0c;命名为Form_wait。 2.在Form_wait,加入需要控件与一个定时器timer1。 数字10为计时显…

dotNET 7:最小 API 使用

最小 API 并不是在 .NET 7 中才加入的&#xff0c;记得应该是在 .NET 6 中就已经提供&#xff0c;只是对我来说&#xff0c;到现在才开始使用。创建一个最小 API在 VS 2022 中创建 WebAPI 项目&#xff0c;不勾选使用控制器&#xff0c;创建出来的就是最小 API &#xff1a;不勾…

Taro小程序采坑记

Taro&#xff0c;京东凹凸实验室出品的适配多端的一个框架&#xff0c; Taro 是一套遵循 React 语法规范的 多端开发 解决方案。现如今市面上端的形态多种多样&#xff0c;Web、React-Native、微信小程序等各种端大行其道&#xff0c;当业务要求同时在不同的端都要求有所表现的…

struts入门

struts工作过程&#xff1a; 反射代码&#xff1a; Class clazz Class.forName("action全路径"); Method m clazz.getMethod("execute"); Object o m.invoke(); package标签&#xff1a; 转发&#xff1a;地址栏不变 修改struts默认常量值&#xff1a; 常…

《Android应用开发攻略》——2.14 备份Android应用程序数据

2.14 备份Android应用程序数据 Pratik Rupwal2.14.1 问题当用户恢复出厂设置或者改用新的Android设备时&#xff0c;应用程序丢失存储数据或者应用程序设置。2.14.2 解决方案Android的Backup Manager&#xff08;备份管理器&#xff09;能够在应用程序重新安装时自动恢复备份数…

C#程序开机启动与获取程序启动路径

写windows工具时&#xff0c;要进行电源管理&#xff0c;需要重启与开关机OS&#xff0c;这样工具就需要自动启动。查了网上很多资料&#xff0c;修改注册列表就可以。 但是&#xff0c;复制几个网站的代码并自己修改都发现不行&#xff0c;最后发现脚本之家这段代码才成功&am…