我有一个复杂的场景我需要解决。
我使用Celery并行运行任务,我的任务涉及HTTP请求,我计划将Celery与eventlet一起用于此目的。
让我解释一下我的情景:
我有两个可以并行运行的任务,第三个任务需要处理这两个任务的输出,因此我使用Celery组来运行2个任务,而Celery链则通过 输出到第三个任务,以便在完成时对其进行处理。
现在它变得复杂了,第三个任务需要产生我想要并行运行的多个任务,我想收集所有输出并在另一个任务中处理它。
所以我为多个任务创建了一个组以及一个链来处理所有信息。
我想我错过了关于Celery并发原语的基本信息,我有一个很好的芹菜任务,但我需要让它更快。
这是代码的简化示例:
@app.task
def task2():
return "aaaa"
@app.task
def task3():
return "bbbb"
@app.task
def task4():
work = group(...) | task5.s(...)
work()
@app.task
def task1():
tasks = [task2.s(a, b), task3.s(c, d)]
work = group(tasks) | task4.s()
return work()
这是我开始此操作的方式:
task = tasks1.apply_async(kwargs=kwargs, queue='queue1')
我保存task.id并每隔30秒拉一次服务器,看看是否有可用的结果:
results = tasks1.AsyncResult(task_id)
if results.ready():
res = results.get()