tornado5.0+async+await
时间:2019-12-17
本文章向大家介绍tornado5.0+async+await,主要包括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接口可以直接拿到返回值,说明两个接口互不阻塞
```
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关键字主要还是在生成器的时候使用
原文地址:https://www.cnblogs.com/Victor-ZH/p/12054076.html
- 洛谷P3375 【模板】KMP字符串匹配
- Day5下午解题报告1
- [编程经验] Python中处理时间的方法小结
- 数据城堡参赛代码实战篇(一)---手把手教你使用pandas
- [编程经验] SciPy之图像处理小结
- Day6上午解题
- TensorFlow从0到1 - 5 - TensorFlow轻松搞定线性回归
- Day6下午题解1
- [编程经验]Python中os模块最最常用的方法
- HDU3853
- [编程经验]Python中的Lambda,Map, Reduce小结
- TensorFlow从0到1 - 6 - 解锁梯度下降算法
- linux下join命令的用法
- [编程经验] 我是如何半自动抓取素材公社图片的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)
- leetcode树之从翻转二叉树
- DiskDB,一个不用网的数据库
- 何时用多线程?多线程需要加锁吗?线程数多少最合理?
- Spring Cloud @RefreshScope 刷新机制必知道
- “非主流”的纯前端性能优化
- CICD(二) Ansible
- JS Sequence Diagrams
- kubernetes(二十一) 微服务链路监控& 自动发布
- kubernetes(八) kubernetes的使用
- kubernetes(九) kubernetes控制器
- kubernetes(十) kubernetes service,ingress&cm,secret
- kubernetes(十一) 存储& statefulset控制器
- kubernetes(十二) 准入控制和helm v3包管理
- JS Flowchart Diagrams