tornado使用异步

网友投稿 659 2022-05-30

为什么要用异步

一般代码都是同步执行,会产生阻塞的问题(比如后端在从数据库中调数据渲染给前端页面时,发现数据库中没有指定数据或者存在脏数据就会出现此问题【会一直显示正在加载】,甚至会卡死!)

而使用异步则可以解决此类问题:

异步处理可以让应用/程序在长时间的API和数据库请求中避免阻塞的时间耗费,最终更快地服务更多请求。

注意——异步的缺陷:

应用异步

1.为了更加直观鲜明的说明为什么要使用异步:

我选择分别使用异步和同步实现同一功能观察各自响应过程,并通过响应时间为直观性标准加以说明。

tornado中使用异步

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小时内删除侵权内容。

上一篇:开发者说:小印章背后的大智能
下一篇:来自实践中的教训,有时候纯ffmpeg命令并不好使,还得需要ffmpy包装器
相关文章