首页 > 解决方案 > Celery 等待来自另一个请求的任务

问题描述

假设有一个需要 1 分钟的长任务。当用户发出请求/get-info并等待响应时,它应该返回一个结果。我正在使用delay()wait()一切正常。现在我想如果另外 5 个用户提出相同的请求/get-info,我希望他们“连接”到同一个任务并在任务完成后得到结果。我正在尝试将任务 ID 保存在 redis 中。但到目前为止,我有两个问题。

  1. 如果我使用AsyncResult()和 wait() 第二个请求挂起。

  2. 如果我使用AsyncResult()并声明,第一个请求会挂起。我该如何实施?

@main.route('/get-info', methods=['POST'])
def get_info():
    if redis.exists('getInfoTaskId'):
        taks_id = redis.get('getInfoTaskId')
        task = add_together.AsyncResult(taks_id)
        result = task.wait()
        # result = task.state - if uncomment and comment the line above the first req hangs
    else:
        task = add_together.delay(23, 42)
        redis.set('getInfoTaskId', task.id, ex=600)
        result = task.wait()
        redis.delete('getInfoTaskId')

    return f"task result is {result}"

标签: pythonasynchronousflaskcelery

解决方案


推荐阅读