在我的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调用任务组之间的确切区别是什么?
答案 0 :(得分:0)
job()
语句表示对组的同步调用。
如果您编写job.apply_async()
,则作业的任务将发布到队列中,并且A立即完成。
尽管在那种情况下,您可能不会遇到SoftTimeLimitExceeded异常,但是由于工作程序可能出现死锁,因此强烈建议不要在任务中调用此类任务。参见https://github.com/celery/celery/issues/3031