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. Angular 项目开发中父子组件传参

    在项目开发中经常会遇到 组件之间传参的问题.今天总结下在使用angular的项目中父子组件传参的问题: 1.父组件向子组件传参: 然后在父组件中 然后在父组件的html中 然后就可以在子组件中使用了 ...

  2. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  3. new delete 创建回收细节

  4. POJ3417(树上差分)

    会卡vector. ; int n, m, Ans; ], to[maxn * ], tot; int vis[maxn], f[maxn]; int d[maxn], sum[maxn]; vect ...

  5. The 17th Zhejiang University Programming Contest Sponsored by TuSimple J

    Knuth-Morris-Pratt Algorithm Time Limit: 1 Second      Memory Limit: 65536 KB In computer science, t ...

  6. Contextual Action bar(2) 简介,启动,各函数介绍

    一.Context Action Bar简介 它是一个ActionBar,有各种操作项,但它不是始终显示的ActionBar,它需要上下文才显示.样式如下: 二.Context Action Bar的 ...

  7. Hibernate的一级缓存:快照区

    参考来源:http://blog.sina.com.cn/s/blog_981ee5d80102w85f.html

  8. 521 Longest Uncommon Subsequence I 最长特殊序列 Ⅰ

    给定两个字符串,你需要从这两个字符串中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列).子序列可以通过删去字符串中的某些字符实现,但不能改变剩余 ...

  9. Oozie的作用

    Oozie的作用: 1.统一调度hadoop系统中常见的mr任务启动. hdfs操作. shell调度. hive操作等 2.使得复杂的依赖关系.时间触发.事件触发使用xml语言进行表达,开发效率提高 ...

  10. RedHat改yum源免费使用CentOS源

    linux默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件 如果我们需要在redhat下直接yum安装软件,我们只用把yum的源修改成CentOS的就好了, ...