一追葡、為什么要用異步?
1奕短、在實際編碼系統(tǒng)中,一般代碼都是同步執(zhí)行的
2谬返、異步解決的問題:
異步處理可以讓應(yīng)用在長時間的API和數(shù)據(jù)庫請求中避免阻塞的時間耗費日杈,最終更快地服務(wù)更多請求 。
3莉擒、注意
異步代碼增加了復(fù)雜度,只在特定場景使用填硕。
二鹿鳖、異步的運用(圖片下載來體現(xiàn)異步的功能)
1扁眯、安裝requests庫
2翅帜、增加一個通過發(fā)送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):
"""
主要是不通過上傳圖片來達(dá)到圖片抓取的效果施敢,代替了上傳的功能
(同步的方式進(jìn)行)
"""
@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):
"""
主要是不通過上傳圖片來達(dá)到圖片抓取的效果,代替了上傳的功能
(異步的方式進(jìn)行,異步函數(shù)一定要有yield關(guān)鍵字來表示)
"""
@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("關(guān)閉阻塞模式")
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("關(guān)閉阻塞模式")
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、注冊相應(yīng)的路由
handlers = [(r'/save', service.SaveHandler)]
三默怨、相關(guān)的一些文檔
固定地址:http://pic1.win4000.com/wallpaper/2018-05-08/5af150aea45bd.jpg
請求隨機(jī)圖片的網(wǎng)址 : http://source.unsplash.com/random
tornado 的異步模塊說明文檔 :異步和非阻塞I/O — Tornado 4.3 文檔