tornado5.0+async+await
不使用数据库的情况下实现异步
使用gen.sleep()模拟阻塞
- 使用gen.sleep(time) 而不是time.sleep(),time.sleep()阻塞整个进程,看gen.sleep()源码,sleep方法返回了一个tuture对象,不是处于阻塞状态而是等待time时间后调用callback函数,在等待的过程中,将控制权交回IOLoop,IOLoop可以处理其他请求
def sleep(duration):
f = _create_future()
# callback匿名函数加入IOLoop循环, future_set_result_unless_cancelled方法完成future的填充
IOLoop.current().call_later(duration,
lambda: future_set_result_unless_cancelled(f, None))
return f def call_later(self, delay, callback, *args, **kwargs):
# 设置多少时间后执行callback
return self.call_at(self.time() + delay, callback, *args, **kwargs) def future_set_result_unless_cancelled(future, value):
if not future.cancelled():
# 执行future.set_result(),完成这个future的填充
future.set_result(value)
如下代码直接复制粘贴运行,在调用http://127.0.0.1:80/blocking 的时候发现正在等待,同时调用/index接口可以直接拿到返回值,说明两个接口互不阻塞
- manage.py
from tornado.web import RequestHandler
from tornado import gen
import tornado.ioloop class IndexHandler(RequestHandler):
def get(self):
self.write('this is index') class BlockingHandler(RequestHandler):
async def get(self):
result = await self.dosomething()
self.write(result) async def dosomething(self):
# 如果是其他处理函数或者逻辑,要保证函数是协程
await gen.sleep(20)
return 'block end' app = tornado.web.Application([
(r"/index", IndexHandler),
(r"/blocking", BlockingHandler)
])
if __name__ == "__main__":
app.listen(80)
tornado.ioloop.IOLoop.instance().start()
使用tornado gen模块下的coroutine装饰器+yield关键字,或者async+await关键字都可实现协程,python3.5以后推荐使用原生协程,yield关键字主要还是在生成器的时候使用
tornado5.0+async+await的更多相关文章
- 测试Promise与Async/await的基本使用
想在项目中用, 发现自己不是很熟 promise基本使用 基本使用-思路 new Promise()返回了一个状态机 一个完全无法被外界影响的状态机 构造函数, 传入一个函数, 两个参数, 分别是re ...
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异
好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...
- .NET4.0中使用4.5中的 async/await 功能实现异步
在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...
- C#Framework4.0支持异步async/await语法
由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...
- Python的异步编程[0] -> 协程[0] -> 协程和 async / await
协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
- [.NET] 利用 async & await 进行异步 IO 操作
利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主 ...
- [C#] 走进异步编程的世界 - 开始接触 async/await
走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...
随机推荐
- ABC155F - Perils in Parallel
简述题意 给你N个数对 表示坐标与状态(0/1), M个操作,给定一个区间,区间内的坐标的状态翻转 思路:看到区间修改,很容易想到差分,对数对sort,每个a_i与a_i-1异或构造差分数组b,每次对 ...
- spark bulkload hbase笔记
1. 现有的三方包不能完全支持 - 官方:hbase-spark,不能设置 timestamp - unicredit/hbase-rdd:接口太复杂,不能同时支持多个 family 2. HFile ...
- 基于金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理
Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样. Git的强大之处在于,你可以在局域网内的任何一个共享路径下创建仓库,而不需要运行任何服务.所有的操作都是 ...
- mysql视图初探
mysql视图初探 官方例子如下,从官方的例子就可以看出来视图就是提供一种快捷查询.用视图来查询一些常用的结果. mysql> help create view; Name: 'CREATE V ...
- 【JS 常用操作】
正则表达式 <script> var str = "(08:30-10:00)"; var patt = /^[(][0-9]{2}:[0-9]{2}-[0-9]{2} ...
- 二十、oracle通过复合索引优化查询及不走索引的8种情况
1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...
- android 动态壁纸开发
转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发参考:http://www.ophonesdn.com/article ...
- pug
https://github.com/pugjs/pug pug模板使用https://www.cnblogs.com/gudi/p/8080736.html
- struts的错误回显
- 记录下spingboot连接阿里云服务器上的MySQL数据库报错
错误大概如下: create connection SQLException, url: jdbc:mysql://'IP地址':3306/code007?useUnicode=true&ch ...