说明

以下的例子都有2个url,一个是耗时的请求,一个是可以立刻返回的请求,,我们希望的是访问立刻返回结果的请求不会被其他耗时请求影响

非异步处理

现在我们请求sleep然后同时请求justnow,发现sleep不执行完,justnow也不会返回结果

#!/bin/env python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient import time from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int) class SleepHandler(tornado.web.RequestHandler):
def get(self):
time.sleep(5)
self.write("when i sleep 5s") class JustNowHandler(tornado.web.RequestHandler):
def get(self):
self.write("i hope just now see you") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[
(r"/sleep", SleepHandler), (r"/justnow", JustNowHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

异步处理

#!/bin/env python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import tornado.gen
from tornado.concurrent import run_on_executor
# 这个并发库在python3自带在python2需要安装sudo pip install futures
from concurrent.futures import ThreadPoolExecutor import time from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int) class SleepHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(2)
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
# 假如你执行的异步会返回值被继续调用可以这样(只是为了演示),否则直接yield就行
res = yield self.sleep()
self.write("when i sleep %s s" % a)
self.finish() @run_on_executor
def sleep(self):
time.sleep(5)
return 5 class JustNowHandler(tornado.web.RequestHandler):
def get(self):
self.write("i hope just now see you") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[
(r"/sleep", SleepHandler), (r"/justnow", JustNowHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

后端异步web请求

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import tornado.gen
from tornado.concurrent import run_on_executor
# 这个并发库在python3自带在python2需要安装sudo pip install futures
from concurrent.futures import ThreadPoolExecutor import time
import json from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int) class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
#client=tornado.httpclient.AsyncHTTPClient()
http = tornado.httpclient.AsyncHTTPClient()
#response=yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8078/sleep")
url="http://127.0.0.1:8098/sleep"
#设置超时时间,如果时间很短可以直接把url 放到fetch(url)内
req = tornado.httpclient.HTTPRequest(url, request_timeout=3000000)
response = yield http.fetch(req)
print(response.body)
data = json.loads(response.body)
print(data)
if 1 == data["ret"]:
self.write(u"国家:%s 省份: %s 城市: %s" % (data["country"], data["province"], data["city"]))
else:
self.write("查询IP信息错误")
self.finish() class JustNowHandler(tornado.web.RequestHandler):
def get(self):
self.write("i hope just now see you") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[
(r"/justnow", JustNowHandler),
(r"/index", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

被请求的网站

模拟新浪IP检测接口,时间加长了

url:http://127.0.0.1:8078/sleep

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import time from tornado.options import define, options
define("port", default=8098, help="run on the given port", type=int) class SleepHandler(tornado.web.RequestHandler): def get(self):
time.sleep(30)
self.write({"ret":1,"start":-1,"end":-1,"country":"\u4e2d\u56fd","province":"\u5317\u4eac","city":"\u5317\u4eac","district":"","isp":"","type":"","desc":""}) if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[
(r"/sleep", SleepHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

参考:http://www.tuicool.com/articles/36ZzA3

最新文章

  1. KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)
  2. TEA,XXTEA介绍,对称加密
  3. Day21_IO第三天
  4. 利用php实现:当获取的网址不是特定网址时候跳转到指定地址
  5. rsync实现免密码操作的一种实现方式
  6. Javascript 选项卡
  7. Sqlserver With as
  8. Android Wear开发 - 入门指引 - Eclipse开发平台搭建
  9. crowd在更改IP后无法登录的问题
  10. Qt串口通信
  11. Makefile中使用$$的使用
  12. H3C低端交换机MAC绑定
  13. windows下一个erlang包装镜像启动
  14. LeetCode 84. Largest Rectangle in Histogram 直方图里的最大长方形
  15. 编译make的出错提示解决方案
  16. python 基础大纲
  17. leetcode insertionSortList 对链表进行插入排序
  18. win10 操作系统 修改桌面图标
  19. 2018.07.06 洛谷P2936 [USACO09JAN]全流Total Flow(最大流)
  20. C#冒泡排序(完整代码)

热门文章

  1. 在crontab中执行shell脚本的问题
  2. 使用jenkins持续集成自动化测试
  3. 实现同时提交多个form(基础方法) 收集(转)
  4. Tomcat 配置虚拟路径保存、访问图片
  5. crt,excrt学习总结
  6. 【Codeforces】Round #488 (Div. 2) 总结
  7. java集成WebSocket向所有用户发送消息
  8. 《selenium2 python 自动化测试实战》(16)——js操作补充
  9. nodejs之fs模块
  10. Android学习路线总结,绝对干货(转)