【问题标题】:Difference between calling task group directly vs. calling it via apply_async in celery直接调用任务组与通过 celery 中的 apply_async 调用它的区别
【发布时间】:2018-11-13 09:49:55
【问题描述】:

在我的tasks.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

在这种情况下,我是直接调用 celery 任务组。问题在于,有时它会在任务 A 中给出 SoftTimeLimitExceeded 异常。我的问题是,如果我调用不直接调用作业,而是使用 apply_async 调用它,这会解决问题吗?另外,直接调用任务组与使用 apply_async 调用它的确切区别是什么?

【问题讨论】:

    标签: python celery


    【解决方案1】:

    job() 语句意味着对组的同步调用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2019-05-15
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2016-01-21
      相关资源
      最近更新 更多