在芹菜中直接调用任务组与通过apply_async调用任务组之间的区别

时间:2018-11-13 09:49:56

标签: python celery

在我的task.py中,我有两个芹菜任务A和B。任务B将用户ID作为参数。任务A收集所有用户ID,并使用每个用户ID创建一组任务B。

@app.task
def A():
    user_ids = get_all_user_ids()
    job = group(B.s(uid) for uid in user_ids)
    job()

@app.task
def B(user_id):
    #some heavy processing

在这种情况下,我直接打电话给芹菜任务组。问题是,有时它在任务A中给出SoftTimeLimitExceeded异常。我的问题是,如果我调用不直接调用作业,而是使用apply_async调用,是否可以解决问题?此外,直接调用任务组与使用apply_async调用任务组之间的确切区别是什么?

1 个答案:

答案 0 :(得分:0)

job()语句表示对组的同步调用。

如果您编写job.apply_async(),则作业的任务将发布到队列中,并且A立即完成。 尽管在那种情况下,您可能不会遇到SoftTimeLimitExceeded异常,但是由于工作程序可能出现死锁,因此强烈建议不要在任务中调用此类任务。参见https://github.com/celery/celery/issues/3031