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

tornado框架基础11-tornado异步的更多相关文章

  1. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  2. tornado框架基础01-路由简介

    tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...

  3. tornado框架基础09-cookie和session

    01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...

  4. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...

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

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

  6. tornado框架基础04-模板基础

    01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...

  7. tornado框架基础03-请求与响应

    01 请求与响应 请求 浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文 请求消息头 向服务器传递附加信息 Accept: 浏览器可以接受的MIME类型. Accept-C ...

  8. tornado框架基础02-输入和输出

    01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...

  9. tornado框架基础06-SQLAlchemy连接数据库

    01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...

随机推荐

  1. Mac下怎么运行python3的py文件

    我的Mac现在是10.14.6系统,默认自带的python版本是2.7.(怎么查看版本?打开终端,输入python即可看到版本号) 由于现在需要运行python3写的py文件,需要将自带的python ...

  2. pika消息中间件模块

    参考: http://www.rabbitmq.com/tutorials/tutorial-one-python.html http://www.rabbitmq.com/tutorials/tut ...

  3. python操作pymongo

    import pymongo from bson import ObjectId mongo_client = pymongo.MongoClient(host="127.0.0.1&quo ...

  4. c#学习系列之关键字where

    where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量.    1.接口约束.         例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就 ...

  5. [已读]响应式web设计实践

    薄的一本,彩印,书质量和内容都不错. 响应设计三要素:媒体查询.流动布局.自适应图片.

  6. websocket 加layim实现在线聊天系统

    实现流程: 1.浏览器连接服务器时保存所有用户id以及对应的唯一session(session用户用户消息推送). 1.1:判断登录用户是否有离线消息(个人消息以及群消息),有则将离线消息进行推送给登 ...

  7. 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围

    1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...

  8. 写给技术lead的招聘指南

    工作这么久,面试过的工程师不下两三百人.大部份招到的人都比靠谱当然也有失败的例子.把亲身经历总结如下: 1. 什么人一定不能招: 理解能力差: 对你提出的问题,答不对题,重复提问.面试官可以在面试当中 ...

  9. MFC技术积累——基于MFC对话框类的那些事儿4

    3.3.4 借助兼容DC加载DIB位图 创建一个与设备环境相兼容的DC,通过将位图暂时导入至兼容DC,然后利用CDC::BitBlt 或者CDC::StretchBlt函数将位图绘制到设备环境中. 示 ...

  10. (转)Spring的概述

    http://blog.csdn.net/yerenyuan_pku/article/details/69663685 Spring的概述 什么是Spring 据度娘所载: Spring是一个开源框架 ...