tornado中使用異步
為什么要用異步
一般代碼都是同步執行,會產生阻塞的問題(比如后端在從數據庫中調數據渲染給前端頁面時,發現數據庫中沒有指定數據或者存在臟數據就會出現此問題【會一直顯示正在加載】,甚至會卡死!)
而使用異步則可以解決此類問題:
異步處理可以讓應用/程序在長時間的API和數據庫請求中避免阻塞的時間耗費,最終更快地服務更多請求。
注意——異步的缺陷:
應用異步
1.為了更加直觀鮮明的說明為什么要使用異步:
我選擇分別使用異步和同步實現同一功能觀察各自響應過程,并通過響應時間為直觀性標準加以說明。
2.實現的同一功能是:
實現指定URL的圖片的上傳功能(其實就是爬蟲爬取圖片)。
3.提供兩個圖片URL以供測試使用(一個是固定圖片的URL/一個是隨機圖片的URL):
①請求隨機圖片的網址 : http://source.unsplash.com/random
②請求固定圖片的網址:http://pic1.win4000.com/wallpaper/2018-05-08/5af150aea45bd.jpg
(1)同步版本實現:
首先下載requests庫以供功能實現使用:
pip install requests
1.指定URL的圖片上傳功能邏輯實現(在handler中創建service.py文件編寫SyncSaveHandler類)
from .main import AuthBaseHandler import requests from utils.photo import UploadImage from utils.account import add_post import tornado.web from uuid import uuid4 class SyncSaveHandler(AuthBaseHandler): """ 同步上傳指定url的圖片功能 """ @tornado.web.authenticated def get(self,*args,**kwargs): # 獲取上傳的地址 save_url = self.get_argument('save_url',None) print('上傳的圖片鏈接',save_url) headers = { 'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36', } resp = requests.get(url=save_url, headers=headers) # 保存上傳的圖片的路徑 print("上傳狀態碼",resp.status_code) # 用戶上傳圖片處理邏輯類的初始化 圖片名稱通過uuid4庫隨機生成 upload_im = UploadImage(self.settings['static_path'], '{}.jpg'.format(uuid4().hex)) # 1.用戶上傳圖片的保存 upload_im.save_upload(resp.content) # 2.生成用戶上傳圖片對應的縮略圖并保存 upload_im.make_thumb() # 3.用戶上傳圖片數據的入庫 add_post(self.current_user, upload_im.image_url, upload_im.thumb_url) # 上傳成功則跳轉到首頁 self.redirect('/')
①固定圖片的URL測試:
運行項目之后,任意登錄某一純凈用戶(新用戶,沒有任何圖片數據),訪問——http://118.31.61.177:8000/save?save_url=http://pic1.win4000.com/wallpaper/2018-05-08/5af150aea45bd.jpg,即可實現指定URL圖片(固定圖片的URL)的上傳并跳轉至首頁。
②隨機圖片的URL的測試:
運行項目之后,任意登錄某一純凈用戶(新用戶,沒有任何圖片數據),訪問——http://118.31.61.177:8000/save?save_url=http://source.unsplash.com/random,即可實現指定URL圖片(隨機圖片的URL)上傳并跳轉至首頁。
(2)異步版本實現:(Tornado官方文檔中推薦使用 協程 寫異步代碼)
異步和非阻塞I/O — Tornado 4.3 官方文檔
生動形象地理解一下異步和非阻塞I/O:
tornado實現異步的模塊:
tornado.gen.coroutine + yield
tornado.httpclient.AsyncHTTPClient
1.指定URL的圖片上傳功能邏輯實現(在handler中創建的service.py文件編寫AsynSaveHandler類)
import tornado.gen import tornado.web from tornado.httpclient import AsyncHTTPClient from uuid import uuid4 class AsyncSaveHandler(AuthBaseHandler): """ 異步上傳指定url的圖片功能 """ @tornado.gen.coroutine def get(self,*args,**kwargs): # 獲取上傳的地址 save_url = self.get_argument('save_url',None) print('上傳的圖片鏈接', save_url) # 構造非阻塞HTTP客戶端 client = AsyncHTTPClient() # 發送請求獲取響應 使用yield回調函數配合執行 .fetch()方法:執行一個請求,異步返回一個' HTTPResponse '! resp = yield client.fetch(save_url) # 用戶上傳圖片處理邏輯類的初始化 圖片名稱通過uuid4庫隨機生成 upload_im = UploadImage(self.settings['static_path'], '{}.jpg'.format(uuid4().hex)) # 1.用戶上傳圖片的保存 upload_im.save_upload(resp.body) # 2.生成用戶上傳圖片對應的縮略圖并保存 upload_im.make_thumb() # 3.用戶上傳圖片數據的入庫 add_post(self.current_user, upload_im.image_url, upload_im.thumb_url) # 上傳成功則跳轉到首頁 self.redirect('/')
①固定圖片的URL測試:
運行項目之后,任意登錄某一純凈用戶(新用戶,沒有任何圖片數據),訪問——http://118.31.61.177:8000/async?save_url=http://pic1.win4000.com/wallpaper/2018-05-08/5af150aea45bd.jpg,即可實現指定URL圖片(固定圖片的URL)的上傳并跳轉至首頁。
②隨機圖片的URL的測試:
運行項目之后,任意登錄某一用戶,訪問——http://118.31.61.177:8000/async?save_url=http://source.unsplash.com/random,即可實現指定URL圖片(隨機圖片的URL)上傳并跳轉至首頁。
(3)總結:
我們觀察上面同步代碼和異步代碼實現的功能測試截圖:
可以明顯看到,使用異步代碼實現隨機圖片下載時(3365.48ms)比使用同步代碼(4197.10ms)要快很多!!!
Tornado
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。