首页 > 解决方案 > 如何将长时间运行的 Celery 作业的结果存储在 JSON 文件中而不阻塞 Flask 上的 REST 端点?

问题描述

我创建了一个长时间运行的 Celery worker 来处理网络抓取并填充字典对象。我创建了多个异步运行的作业,所有这些作业都填充同一个 dict 对象。我需要一种将我的工作人员中的结果转储到 JSON 文件的方法。它可以定期或在工作完成后完成,但它不应阻止我的 API 响应。

@celery.task(name="tasks.workertask")
def worker(d, x):
    """
    Do some long task on x and populate the dictionary d
    """

def collect(x_list)
    d = dict()
    for x in x_list:
        worker.delay(d,x)
    return d.copy()

@application.route('/api')
def api():
    #Store x_list
    x_list = [...]
    d = collect(x_list)
    with open('result.json','w') as fp:
        json.dump(d,fp)
    return "Dumping into JSON"

转储到 result.json 是空的,因为任务在后台运行。我不希望这个任务阻塞我的 API 响应,因为任务非常长(超过 12 小时)

标签: pythonjsonflaskcelery

解决方案


推荐阅读