【问题标题】:Django 2/3 only one post_save generated celery signal received each time model is savedDjango 2/3 每次保存模型时只接收一个 post_save 生成​​的 celery 信号
【发布时间】:2020-10-21 04:59:47
【问题描述】:

我使用多个 post_save 函数来触发不同的 celery(4.4.0、4.8.3)任务并尝试了 Django 2 和 3。出于某种奇怪的原因,celery 停止并行执行所有任务,而是每次模型被接收时只收到一个任务保存。其他任务甚至都没有收到。

要运行所有任务,我必须多次保存模型。它以前工作过,我不知道为什么行为突然改变了。

我开始排队:

celery -A appname worker -l info -E

我的帖子保存功能:

@receiver(models.signals.post_save, sender=RawFile)
def execute_rawtools_qc(sender, instance, created, *args, **kwargs):
    rawtools_qc.delay(instance.path, instance.path)

@receiver(models.signals.post_save, sender=RawFile)
def execute_rawtools_metrics(sender, instance, created, *args, **kwargs):
    rawtools_metrics.delay(instance.abs_path, instance.path)

还有我的任务:

@shared_task
def rawtools_metrics(raw, output_dir):
    cmd = rawtools_metrics_cmd(raw=raw, output_dir=output_dir)
    os.system(cmd)

@shared_task    
def rawtools_qc(input_dir, output_dir):
    cmd = rawtools_qc_cmd(input_dir=input_dir, output_dir=output_dir)
    os.system(cmd)

在保存模型后立即并行执行的那些任务之前。现在,第一个任务在模型实例保存时执行,第二个实例在模型第二次保存时执行。然后功能每次交替。知道什么可能导致这种奇怪的行为吗?

更新:我认为这两个任务都是随机执行的,但每次保存只有一个。

此外,没有其他芹菜工人在运行。

【问题讨论】:

    标签: django celery django-celery


    【解决方案1】:

    如果您为同一模型运行这两个函数,请在相同的 post_save 方法中运行它们:

    @receiver(models.signals.post_save, sender=RawFile)
    def execute_rawtools_qc(sender, instance, created, *args, **kwargs):
        rawtools_qc.delay(instance.path, instance.path)
        rawtools_metrics.delay(instance.abs_path, instance.path)
    

    【讨论】:

    • 另外,我试过了,但问题还是一样。因此,我认为是芹菜的问题。
    • 您可以查看芹菜大师以声明您的评论吗?欢迎投稿
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2013-07-04
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2021-07-13
    相关资源
    最近更新 更多