问题:通过接口进行hive查询,太慢,使用fastapi框架,本想使用BackgroundTasks,但hive没有异步处理框架。查询到说是可以使用asyncio方法实现,但试了下后,发现不可以

解决:使用rq队列,通过队列方式处理hive查询,然后进行回调

注意:

1、jobs中的任务文件,引入config时注意路径,问题,可能需要把config所在目录加入项目环境变量

2、rq执行有时间限制,配置redis时需要配置下

# 增加超时时间为300秒  
q = Queue(connection=redis_conn, default_timeout=300)
或者
job = q.enqueue(my_function, args=(arg1, arg2), timeout=300)

问题:rqworker 运行时报错ERROR:root:Authentication required. 使用的是redis作为存储,因为redis设置了密码

解决:可以通过--url参数设置redis连接链接;也可以通过export设置redis连接链接为环境变量

方法:

1、rq连接redis

from rq import Queue
from redis import StrictRedis
from .config import config

redis_config = { 
    'host': config['RQ_SVR'],
    'db': config['RQ_DB'],
    'password': config['RQ_PASS']
    }   
redis_url = 'redis://:{password}@{host}:6379/{db}'.format(**redis_config)
redis_conn = StrictRedis.from_url(redis_url)
q = Queue(connection=redis_conn)

阅读全文

问题:导出文件时,如何将字节流返回给前端,前端通过blob方式获取

方法:
Tornado

import xlwt
from io import BytesIO

class ApiDownloadHandler(BaseHandler):
    @login_required()
    def post(self):
        # 设置响应头
        self.set_header('Content-Type', 'application/x-xls')
        # filename 不能为中文
        self.set_header('Content-Disposition', 'attachment; filename=download.xls')
        wb = xlwt.Workbook()
        ws = wb.add_sheet('Sheet1')
        style0 = xlwt.easyxf('font: name Microsoft YaHei Light, height 220; align: vert centre, horiz center')
        # title
        header = ['序号', '姓名', '年龄']
        for i in range(len(header)):
            ws.write(0, i, header[i], style0)
            ws.col(i).width = 4000
        sio = BytesIO()
        # 这点很重要,传给save函数的不是保存文件名,而是一个StringIO流
        wb.save(sio)
        self.write(sio.getvalue())

阅读全文

问题:方法中如何调用另一个类中__call__方法?

方法:

class foo(object):
    def __init__(self):
        self.name = 'python'

    def __call__(self, *args, **kwargs):
        print('hello%s'%self.name)

def run():
    instance = foo()
    instance()
    a = instance
    print dir(a)

阅读全文