一、为什么要用异步?
1、在实际编码系统中,一般代码都是同步执行的
2、异步解决的问题:
异步处理可以让应用在长时间的API和数据库请求中避免阻塞的时间耗费,最终更快地服务更多请求 。
3、注意
异步代码增加了复杂度,只在特定场景使用。
二、异步的运用(图片下载来体现异步的功能)
1、安装requests库
2、增加一个通过发送url来代替上传图片的功能
3、service.py文件中的代码
import requests
import tornado.web,tornado.gen
from tornado.httpclient import AsyncHTTPClient
import time
import logging
from utiles.photo import UploadImage
from Handlers.main import BaseHandler
logger = logging.getLogger('xiaolong.log')
class SynSaveHandler(BaseHandler):
"""
主要是不通过上传图片来达到图片抓取的效果,代替了上传的功能
(同步的方式进行)
"""
@tornado.web.authenticated
def get(self):
save_url = self.get_argument('save_url', '')
logger.info(save_url)
resp = requests.get(save_url)
# time.sleep(30),等待过程
if resp.status_code is 200:
up_img = UploadImage('.jpg', self.settings['static_path'])
up_img.save_content(resp.content)
up_img.make_thumb()
post_id = self.orm.add_post(self.current_user, up_img.image_url, up_img.thumb_url)
if post_id:
self.redirect('/post/{}'.format(str(post_id)))
else:
self.write('错误')
class SaveHandler(BaseHandler):
"""
主要是不通过上传图片来达到图片抓取的效果,代替了上传的功能
(异步的方式进行,异步函数一定要有yield关键字来表示)
"""
@tornado.web.authenticated
@tornado.gen.coroutine
def get(self):
save_url = self.get_argument('save_url', '')
logger.info(save_url)
client = AsyncHTTPClient()
resp = yield client.fetch(save_url, request_timeout=400)
logger.info("开启阻塞模式")
yield tornado.gen.sleep(2)
logger.info("关闭阻塞模式")
logger.info(resp.code)
if resp.code is 200:
up_img = UploadImage('.jpg', self.settings['static_path'])
up_img.save_content(resp.body)
up_img.make_thumb()
post_id = self.orm.add_post(self.current_user, up_img.image_url,\
up_img.thumb_url)
if post_id:
self.redirect('/post/{}'.format(str(post_id)))
else:
self.write('错误')
@tornado.web.authenticated
@tornado.gen.coroutine
def post(self):
save_url = self.get_argument('save_url', '')
logger.info(save_url)
client = AsyncHTTPClient()
resp = yield client.fetch(save_url, request_timeout=400)
logger.info("开启阻塞模式")
yield tornado.gen.sleep(2)
logger.info("关闭阻塞模式")
logger.info(resp.code)
if resp.code is 200:
up_img = UploadImage('.jpg', self.settings['static_path'])
up_img.save_content(resp.body)
up_img.make_thumb()
post_id = self.orm.add_post(self.current_user, up_img.image_url, \
up_img.thumb_url)
if post_id:
self.redirect('/post/{}'.format(str(post_id)))
else:
self.write('错误')
4、注册相应的路由
handlers = [(r'/save', service.SaveHandler)]
三、相关的一些文档
固定地址:http://pic1.win4000.com/wallpaper/2018-05-08/5af150aea45bd.jpg
请求随机图片的网址 : http://source.unsplash.com/random
tornado 的异步模块说明文档 :异步和非阻塞I/O — Tornado 4.3 文档