01 同步和异步

生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗?

同步

含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系

现象:有一个共同的时钟,按来的顺序一个一个处理

直观感受 :就是需要等候,效率低下

异步

含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位

现象:没有共同的时钟,不考虑顺序来了就处理

直观感受:就是不用等了,效率高

02 阻塞和非阻塞

同样是刚才排队的情形,当你在排队的同时,你的状态是怎样的呢?在计算机里面应该怎么描述呢?

阻塞调用与非阻塞调用

阻塞调用

含义 : 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回

现象:读套接字时没有数据等数据来,写套接字时写不下了也一直等,等能写下了往里写(套接字被写满的原因不在本地,在于网络另一头的套接字被写满了来不及读出去,导致本地的套接字内容来发不出去堵住了)

直观感受:执着

非阻塞调用

含义 :非阻塞调用是指没有调用结果立即返回,当前线程不被挂起,可以继续做其它工作

现象:读套接字时没有数据,不等直接返回干别的事去,写套接字写不下了也不写了,直接返回干别的事去

直观感受:勤奋

03 异步编程

三种方式:协程,回调函数,requests

在前面的介绍的基础上,来看下 Tornado 中,当同时有多个请求发送过来时,而且其中还有请求发生阻塞,会产生什么样的后果呢?

通过回调函数来实现异步

import tornado.httpclient

class CallbackHandler(BaseHandler): """通过回调函数来实现异步"""

   @tornado.web.asynchronous

   def get(self):

     client = tornado.httpclient.AsyncHTTPClient() # 异步的方

    client.fetch("http://127.0.0.1:8000/sync",callback=self.on_response) self.write('Ok!'+' ')

  def on_response(self,response): ​

     self.write(response.body) ​

     self.finish() # 注意一定要加上,回调的异步完成后不会自动执行finish,所以在这里要手动加上.

通过协程实现异步

导入模块

import tornado.gen

class GenHandler(BaseHandler): """通过协程实现的异步"""

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 协程

  def get(self): ​

  client = tornado.httpclient.AsyncHTTPClient() ​

  response = yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8000/sync") ​

  self.write(response.body)

通过协程实现异步(自定义函数)

class FuncHandler(BaseHandler): """通过协程实现的异步"""

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 协程

   def get(self):

   response = yield self.func()

   print(response)

   self.write(response.body)

   @tornado.gen.coroutine

   def func(self):

     client = tornado.httpclient.AsyncHTTPClient()

     response = yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8000/sync")

     raise tornado.gen.Return(response)

通过协程来实现异步(使用requests模块)

第一步:安装模块

pip install futures

pip install requests

第二步:导入模块

from tornado.concurrent import run_on_executor

from concurrent.futures import ThreadPoolExecutor

import requests

通过协程来实现异步(使用requests模块)

class MyFuncHandler(BaseHandler): """通过协程实现的异步"""

   executor = ThreadPoolExecutor()

   @tornado.web.asynchronous

   @tornado.gen.coroutine # coroutine 协程

   def get(self):

     response = yield self.func()

     print(response)

     self.write(response.text)

   @run_on_executor

   def func(self):

   response = requests.get("http://127.0.0.1:8000/sync")

   return response

转载于:https://www.cnblogs.com/winfun/p/10974335.html

tornado框架基础11-tornado异步相关推荐

  1. Tornado框架基础

    Tornado框架的使用 – 潘登同学的Tornado学习笔记 文章目录 Tornado框架的使用 -- 潘登同学的Tornado学习笔记 快速上手 Tornado的注意事项 Tornado 参数设置 ...

  2. tornado框架基础05-模板继承、UImodul和UImethods

    01 模板继承 父模板​ <html lang="en"> <head>     <meta charset="UTF-8"> ...

  3. Tornado框架入门教程

    Tornado框架入门教程 Tornado在知乎广为使用,当你用Chrome打开网页版本的知乎,使用开发者工具仔细观察Network里面的请求,就会发现有一个特别的状态码为101的请求,它是用浏览器的 ...

  4. 陈华编程学院 | Laravel5.2框架基础视频教程(免费)

    Laravel5.2框架基础视频教程,共 18课时 / 5时09分.虽然讲解的Laravel5.2的框架基础知识,但Laravel5的小版本更新中,框架基础核心是不变的,所以本课程可以作为Larave ...

  5. 5.(基础)tornado异步

    终于到了传说中的异步了,感觉异步这个名字听起来就很酷酷的,以前还不是多擅长Python时,就跑去看twisted的源码,结果给我幼小的心灵留下了创伤.反正包括我在内,都知道异步编程很强大,但是却很少在 ...

  6. python异步查询数据库_Python的Tornado框架实现异步非阻塞访问数据库的示例

    tornado即是一个http非阻塞服务器, 就要用起来, 我们将用到tornado框架 ,mongodb数据库 以及motor(mongodb的异步驱动).来简单实现tornado的非阻塞功能. 其 ...

  7. python异步框架twisted_对比Tornado和Twisted两种异步Python框架

    做Python的人,一定知道两个性能优秀的异步网络框架:tornado,和twisted. 那么,这两个著名的框架,又有什么异同呢?tornado和twisted,我都用在几个游戏项目中,做过后端,觉 ...

  8. 自学Python第二十六天- Tornado 框架

    自学Python第二十六天- Tornado 框架 安装及基础引用 创建.配置.初始化应用及简单运行服务 创建应用 对 app 进行设置 另一种设置方法 一些其他的配置 关于调试模式 设置路由处理器 ...

  9. python开发h5页面_使用Python的Tornado框架实现一个Web端图书展示页面

    首先,为什么选择Tornado:1.高性能的网络库,这可以和gevent,twisted,libevent等做对. 提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpcli ...

最新文章

  1. C++ 面向对象(类对象)
  2. python爬取mysql数据_Python爬取数据并写入MySQL数据库的实例
  3. VC6中使用高版本系统API的方法
  4. BASIC-8 回文数
  5. python科学计算笔记(十四)pandas数据过滤、清理、转换
  6. java 正则提取及替换字符串
  7. tracker服务器列表2020_个人服务器采购整理分享
  8. python列表生成式原理_三元表达式/和/或如何在Python中工作/真与假的性质/列表生成/生成器,and,or,执行,原理,True,False,本质,生成式...
  9. spark kafka java api_java实现spark streaming与kafka集成进行流式计算
  10. 小区重选优先级_NR小区重选理论研究
  11. [Codeforces667A]Pouring Rain(数学,几何)
  12. 商务与经济统计学习笔记整理/安德森/第13版
  13. 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
  14. nyoj素数环(dfs)
  15. Python学习002—python的安装以及pip
  16. python bi_这5款BI工具,Python工程师最爱用
  17. 在英语语法的基础上分析荷兰语的一些语法点
  18. 基于STC89C51单片机的温湿度检测系统
  19. Spark数据倾斜解决方案(收藏级)
  20. 1NF | 2NF | 3NF的区分以及什么是函数依赖、部分函数依赖、值传递依赖(最详细的讲解1NF、2NF、3NF的关系)

热门文章

  1. 关于Unity中的Mesh Collider碰撞器
  2. linux 文件夹的颜色代表什么意思
  3. 用SQL语句更改数据库名,表名,列名
  4. Interesting Finds: 2008.03.24
  5. C# 调用FLashPaper2(二)
  6. 用TortoiseGit时的实用git命令
  7. springboot 整合 mongodb实现 批量更新数据
  8. 1088. [SCOI2005]扫雷Mine【网格DP】
  9. Linux删除特殊字符文件
  10. 安卓关于图片压缩的那些事儿,希望给每个安卓开发人员一些帮助