18

所以,基本上我想构建一个在heroku上使用RQ的长轮询应用程序。我看过这个问题Flask: passing around background worker job (rq, redis)但它没有帮助。

这基本上就是我正在做的。

@app.route('/do_something', methods=['POST'])
def get_keywords():
    data_json = json.loads(request.data)
    text = urllib.unquote(data_json["sentence"])

    job = q.enqueue(keyword_extraction.extract, text)
    return job.key

@app.route('/do_something/<job_id>', methods=['GET'])
def get_keywords_results(job_id):
    job = Job().fetch(job_id)

    if(not job.is_finished):
        return "Not yet", 202
    else:
        return str(job.result)

没有什么花哨的,所以当 POST 请求到来时,它会将作业排队并立即将 job_id 返回给用户,然后用户将使用密钥继续轮询结果。Job().fetch(job_id)但是,当这条线返回时,我似乎无法让它工作

NoRedisConnectionException: Could not resolve a Redis connection.

任何帮助将非常感激。

4

3 回答 3

22

我已经发现了这一点,以防有人感兴趣。它必须是这个。

Job.fetch(job_id, connection=conn)
于 2013-03-03T13:12:30.180 回答
4

0.13.0在我运行时发现的RQ 版本中:

j = q.enqueue(job_func)

j.key将是前面的键rq:job:

因此,在获取我需要使用的作业时,框架中的其他地方:

j = q.fetch_job(key[7:])

j.result将在哪里None或返回值job_func

不知道是否有更好的方法来处理这个......

于 2019-02-11T04:39:35.670 回答
1

这是由于现在已修复的回归,有关详细信息,请参阅https://github.com/nvie/rq/issues/479

您需要从 github master 分支安装才能解决此问题,直到将其发布到 PyPI。

于 2016-06-20T15:56:52.010 回答