深入异步应用--异步和协程的介绍(二十四)

一、为什么要用异步?

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 文档

你可能感兴趣的:(深入异步应用--异步和协程的介绍(二十四))