1

我有一个很长的任务进入 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尝试将结果保存为它的计算,最多只需要每周运行一次,每月一次也足够了。

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

还有其他方法可以做到这一点吗?或者建议我应该如何处理这个问题?

4

1 回答 1

2

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

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

这应该被缓存得很好。

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

@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)
于 2015-12-23T18:35:47.543 回答