将计算存储在烧瓶路径缓存中

时间:2015-12-23 18:26:03

标签: python flask python-rq flask-cache

我有一个很长的任务,进入python-rq工作队列。

@cache.cached(timeout=2592000)
@app.route('/as/<keyword>', methods=['GET'])
@db_session
def auto_suggest(keyword):
    job = q.enqueue(find_keyword, keyword)
    while not job:
        time.sleep(1)
    return jsonify(word=job)

我使用flask-cache尝试将结果保存为最多只需要每周运行一次的计算,每月一次就足够了。

我遇到的问题是,当它运行时,它会缓存失败的响应,而不是实际的解决方案。

还有其他办法吗?或者建议如何处理这个问题?

1 个答案:

答案 0 :(得分:2)

您正在尝试对Job代理对象进行JSON编码,而不是作业的结果。您确实想在此处检查作业结果

job = q.enqueue(find_keyword, keyword)
while not job.result:
    time.sleep(1)
return jsonify(word=job.result)

这应该缓存得很好。

您可以使用Cache.memoize() decorator来记住find_keyword函数的结果:

@cache.memoize(30 * 24 * 60 * 60)
def find_keyword(keyword):
    # ....

这将基于find_keyword()参数缓存keyword函数的结果一个月(不同关键字的结果将独立缓存)。

还有一点需要注意:当将额外的装饰器应用于视图函数时,请确保将@app.route()装饰器放在顶部(最后应用)。任何“稍后”应用的装饰器都会被忽略,因为它们的输出不是被注册为视图:

@app.route('/as/<keyword>', methods=['GET'])
@cache.cached(timeout=2592000)
@db_session
def auto_suggest(keyword):
    job = q.enqueue(find_keyword, keyword)
    while not job.result:
        time.sleep(1)
    return jsonify(word=job.result)