项目 09 深入应用异步和协程

项目 09 深入应用异步和协程

  handlers/service.py 创建一个新的py文件

import time
from datetime import datetime

import tornado.httpclient
import tornado.gen
import tornado.web

from .main import AuthBaseHandler
from utils import photo, account
class SyncImageHandler(AuthBaseHandler):
    '''
    原始版本,非异步
    '''

    @tornado.web.authenticated
    def get(self):
        resp = self.fetch_image()
        if not resp.body:
            self.write('empty data')
            return

        img_saver = photo.ImageSave(self.settings['static_path'], 'x.jpg')
        img_saver.save_upload(resp.body) # body 就是图片数据
        img_saver.make_thumb()  # 做缩略图
        post = account.add_post_for(self.current_user, img_saver.upload_url, img_saver.thumb_url)  # 添加到数据库,拿到 post 实例

        self.redirect('/post/{}'.format(post.id)) # 跳转到 post 页面


    def fetch_image(self):
        """ 用内部客户端去下载图片 """
        url = self.get_argument("url", None) # 取 ?url= 的值
        client = tornado.httpclient.HTTPClient()
        print("---going to fetch:{}".format(url))
        resp = client.fetch(url)
        return resp
import time
from datetime import datetime

import tornado.httpclient
import tornado.gen
import tornado.web

from .main import AuthBaseHandler
from utils import photo, account


class ImageHandler(AuthBaseHandler):
    """ 异步版本 """

    @tornado.web.authenticated
    @tornado.gen.coroutine
    def get(self):
        resp = yield self.fetch_image() #在会发生阻塞的地方加上yield,并在函数上面加上装饰器@tornado.gen.coroutine
        if not resp.body:
            self.write('empty data')
            return

        img_saver = photo.ImageSave(self.settings['static_path'], 'x.jpg')
        img_saver.save_upload(resp.body) # body 就是图片数据
        img_saver.make_thumb()  # 做缩略图
        post = account.add_post_for(self.current_user, img_saver.upload_url, img_saver.thumb_url)  # 添加到数据库,拿到 post 实例
        print("-- {} -end fetch:#{}".format(datetime.now(), post.id))

        self.redirect('/post/{}'.format(post.id)) # 跳转到 post 页面
    
    # @tornado.gen.coroutine
    def fetch_image(self):
        """ 用内部客户端去下载图片 """
        url = self.get_argument("url", None) # 取 ?url= 的值
        client = tornado.httpclient.AsyncHTTPClient() #异步的版本需要在这里改变获取用户的方式
        print("-- {} -going to fetch:{}".format(datetime.now(), url))
        # yield tornado.gen.sleep(6)

        # resp = client.fetch(url)
        return client.fetch(url)

  并在app.py里面添加路由

posted on 2018-06-30 12:08  许铖铖  阅读(144)  评论(0编辑  收藏  举报