同步:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 现象:有一个共同的时钟,按来的顺序一个一个处理

异步:双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了就处理

四种异步:

import tornado.ioloop
import tornado.web from data.table_1 import User
from tornado.web import authenticated from pycket.session import SessionMixin import tornado.websocket
from datetime import datetime
import time import tornado.options
import tornado.httpserver
from tornado.options import define, options define('port',default=8000, help='run port', type=int)
define('version', default=0.1, help='version', type=str) class BaseHandler(tornado.web.RequestHandler, SessionMixin):
def get_current_user(self):
# current_user = self.get_secure_cookie('ID')
current_user = self.session.get('ID')
if current_user:
return current_user
return None class AbcHandler(BaseHandler):
def get(self):
self.write('abc') import tornado.httpclient
class SyncHandler(BaseHandler):
def get(self):
client = tornado.httpclient.HTTPClient() # 同步HTTPClient
response = client.fetch('http://127.0.0.1:8000/sync') # 8000已经启动,去访问sync(相当于调用接口)
print(response)
self.write('----SyncHandler---') # 可能发生阻塞用异步
class CallbackHandler(BaseHandler):
""" 1.通过回调函数实现异步 """
@tornado.web.asynchronous # 将请求变成长连接
def get(self):
client = tornado.httpclient.AsyncHTTPClient() # 异步AsyncHTTPClient
# 阻塞完毕后调用 callback
response = client.fetch('http://127.0.0.1:8000/sync', callback=self.on_response)
print(response)
self.write('OK'+'<br>') def on_response(self, response):
print(response)
self.write('----CallbackSyncHandler---')
self.finish() # 回调结束,请求结束,响应到浏览器(否则浏览器一直等待状态) import tornado.gen
class GenHandler(BaseHandler):
""" 2.通过协程实现异步 yield """
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
client = tornado.httpclient.AsyncHTTPClient() # 异步
# 节省内存(暂停)
response = yield tornado.gen.Task(client.fetch,'http://127.0.0.1:8000/sync')
print(response)
self.write('---gen----') class FuncHandler(BaseHandler):
""" 3.通过协程实现异步 yield 调用函数 @tornado.gen.coroutine装饰函数(函数需要用到yield)"""
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
response = yield self.fun()
print(response)
self.write('---gen----') @tornado.gen.coroutine
def fun(self):
client = tornado.httpclient.AsyncHTTPClient() # 异步
response = yield tornado.gen.Task(client.fetch, 'http://127.0.0.1:8000/sync')
raise tornado.gen.Return(response) from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor # (它是由thread模块封装的(创建线程的模块))
import requests class ExeHandler(BaseHandler):
""" 4.通过协程实现异步 yield 调用函数 @run_on_executor装饰函数(函数不用yield)
需要下载requests 和futures"""
executor = ThreadPoolExecutor() # 当发生阻塞时,能够创建一个新的线程来执行阻塞的任务(多线程)
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
response = yield self.fun()
print(response)
self.write('---exe----') @run_on_executor
def fun(self):
response = requests.get( 'http://127.0.0.1:8000/sync')
return response application = tornado.web.Application(
handlers=[
(r"/sync", SyncHandler),
(r"/abc", AbcHandler),
(r"/callback", CallbackHandler),
(r"/gen", GenHandler),
(r"/func", FuncHandler),
(r"/exe", ExeHandler),
],
cookie_secret='haha',
debug=True
) if __name__ == '__main__':
tornado.options.parse_command_line() # 获取命令行的参数 --port=1040 就能使用这个参数
print(options.port)
print(options.version) http_server = tornado.httpserver.HTTPServer(application)
application.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

tornado--同步异步的更多相关文章

  1. 【测试】Gunicorn , uWSGI同步异步测试以及应用场景总结

    最近使用uwsgi出了一些问题,于是测试下Gunicorn测试对比下 环境 一颗cpu 1g内存 Centos系统 Django作为后端应用,Gunicorn默认模式和异步模式,响应基本是无阻塞类型 ...

  2. 深入理解yield(三):yield与基于Tornado的异步回调

    转自:http://beginman.cn/python/2015/04/06/yield-via-Tornado/ 作者:BeginMan 版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须 ...

  3. tornado 之 异步非阻塞

    异步非阻塞 1.基本使用 装饰器 + Future 从而实现Tornado的异步非阻塞 import tornado.web import tornado.ioloop from tornado im ...

  4. tornado 11 异步编程

    tornado 11 异步编程 一.同步与异步 同步 #含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 #现象:有一个共同的时钟,按来的顺序一个一个处理 #直观感受:需要等待,效率 ...

  5. Python核心框架tornado的异步协程的2种方式

    什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...

  6. Tornado中异步框架的使用

    tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...

  7. Tornado之异步非阻塞

    同步模式:同步模式下,只有处理完前一个任务下一个才会执行 class MainHandler(tornado.web.RequestHandler): def get(self): time.slee ...

  8. .Net Core WebAPI 基于Task的同步&异步编程快速入门

    .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...

  9. AJAX请求详解 同步异步 GET和POST

    AJAX请求详解 同步异步 GET和POST 上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面 ...

  10. 同步异步,阻塞非阻塞 和nginx的IO模型

    同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...

随机推荐

  1. can-utils源码解析cansend

    前言 本文主要介绍socketCan中的发送函数cansend的源码解析. 代码 /* * cansend.c - simple command line tool to send CAN-frame ...

  2. Linux/Unix下Shell快捷键操作集合

    本人收集整理了一些Bash或其他Shell中常用的快捷键,使用技巧以及Ubuntu中一些常用操作的快捷键,希望大家能从中受益,提高工作效率. 使用”!”从历史中执行命令 有时候,我们需要在 Bash ...

  3. linux下磁盘分区详解

    Centos下磁盘管理     1.磁盘分区格式说明 linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a—d)因为IDE硬盘最多四个,SCSI,SATA,USB ...

  4. 20155328 2016-2017-2 《Java程序设计》第5周学习总结

    教材学习内容总结 程序设计本身的错误,建议使用Exception或其子类实例来表现. Java中所有错误都会被打包成对象. 如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远 ...

  5. Laravel学习之旅(二)

    控制器 一.怎么编写控制器? 1.控制器文件存放路径:app\Http\Controllers: 2.命名规范如:TestController.php 3.完整的控制器例子如下: <?php n ...

  6. layer关闭弹出层总结

    //关闭方法1 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer.open({type: 1})方式调用, ...

  7. LG2044 [NOI2012]随机数生成器

    题意 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c ...

  8. IntelliJ IDEA 2017激活

    最新更新: 在激活Jetbrains旗下任意产品的时候选择激活服务器 填入以下地址便可成功激活 http://idea.liyang.io 点击help→Register→License sever ...

  9. hive 数据导出三种方式

    今天我们再谈谈Hive中的三种不同的数据导出方式.根据导出的地方不一样,将这些方式分为三种:(1).导出到本地文件系统:(2).导出到HDFS中:(3).导出到Hive的另一个表中.为了避免单纯的文字 ...

  10. vault 集群搭建(active standby 模式)

        参考架构图: consul server cluster 搭建 consul 基本配置格式 { "server": true, "node_name": ...