不使用数据库的情况下实现异步

  • 使用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关键字主要还是在生成器的时候使用

最新文章

  1. Java版本:识别Json字符串并分隔成Map集合
  2. iOS后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务
  3. ASP.NET网站入侵第三波(fineui系统漏洞,可导致被拖库)
  4. js加密的密文让PHP解密(AES算法)
  5. 【leetcode❤python】 203. Remove Linked List Elements
  6. c++ 程序在内存中的分布
  7. 【英语】Bingo口语笔记(61) - mind系列
  8. oracle锁
  9. mysql事务回滚
  10. Google翻译
  11. linux搭建java环境
  12. brew udpate出现错误“/usr/local is not writable.”的问题解决
  13. 关于MVC结构
  14. 基于webpack2.x的vue2.x的多页面站点
  15. 牛腩新闻公布系统--学习Web的小技巧汇总
  16. [Swift]LeetCode552. 学生出勤记录 II | Student Attendance Record II
  17. Annihilate(SA)
  18. Django之auth组件
  19. C# 截取 byte 字节 转字符串
  20. c++、Java、python对应的编译型语言和解释性语言区别详解

热门文章

  1. Day11 - H - Euclid's Game HDU - 1525
  2. Node.js之EventEmiter
  3. python的沙盒环境--virtualenv
  4. linux编译C
  5. Leet Code 8.字符串转换整数
  6. SpringBoot开发环境要求
  7. Pyspider的基本使用 -- 入门
  8. Mongo2Go 介绍
  9. Linux下如何拷贝整个目录下的所有文件
  10. dotnet-千星项目OpenAuthNet基于NetCore21的快速开发框架