美文网首页
深入异步应用--异步和协程的介绍(二十四)

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

作者: 梦捷者 | 来源:发表于2020-04-16 08:48 被阅读0次

一、为什么要用异步?

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)]

三、相关的一些文档

相关文章

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

    一、为什么要用异步? 1、在实际编码系统中,一般代码都是同步执行的 2、异步解决的问题:异步处理可以让应用在长时间...

  • 异步和协程介绍

    当执行一段代码时,由CPU执行,磁盘读写、网络通信等IO操作相比于CPU执行代码的速度要慢很多,所以如果是同步的情...

  • fastcgi 异步实现和协程实现比较

    介绍 异步模型和协程模型都是原fastcgi的优化模型。 cocgi是使用腾讯开源库libco实现的协程模式的fa...

  • Python 异步IO和协程

    01. 并发、并行、同步、异步、阻塞、非阻塞概念理解 并发、并行 并发:是指一个时间段内,有几个程序在同一个CPU...

  • python异步IO和协程

    @[toc] IO模型 同步IO 在IO过程中当前线程被挂起,当前线程其他需要CPU计算的代码无法执行一般的io是...

  • Python协程还不理解?请收下这份超详细的异步编程教程!

    ​1. 初探 在了解异步协程之前,我们首先得了解一些基础概念,如阻塞和非阻塞、同步和异步、多进程和协程。 1.1 ...

  • 并发编程-协程

    协程greenlet模块 (gevent实现原理)gevent模块 (注册协程,实现异步编程) 协程的应用eg:...

  • python爬虫11:gevent queue

    同步和异步的概念 异步:gevent库 多协程,是非抢占式的异步方法,使用多协程,能让多个爬虫用异步方式交替执行多...

  • tornado服务死锁问题排查

    python的tornado框架用到了io多路复用和协程的技术。由于tornado是单线程的异步框架,如果运行过程...

  • Python 爬虫-异步加载

    主要内容有:1,AJAX 技术介绍2,JSON介绍与应用3,异步GET与POST请求4,特殊的异步加载5,多次请求...

网友评论

      本文标题:深入异步应用--异步和协程的介绍(二十四)

      本文链接:https://www.haomeiwen.com/subject/wnwqmctx.html