【问题标题】:Celery @task_postrun.connect not firing芹菜@task_postrun.connect没有触发
【发布时间】:2018-08-10 15:33:14
【问题描述】:

我的project/jobs 应用程序中有一个signals.py。 这是文件:

from celery.signals import task_postrun, after_task_publish
from project.jobs.models import JobModel, JOB_STATUS_CHOICES

@after_task_publish.connect
def task_sent_handler(sender=None, headers=None, body=None, **kwargs):
    info = headers if 'task' in headers else body
    print('after_task_publish for task id {info[id]}'.format(info=info,))

@task_postrun.connect
def task_postrun_handler(task_id=None, **kwargs):
    print('CONNECT', task_id)
    JobModel.objects.filter(task_id=task_id).update(status=JOB_STATUS_CHOICES.SUCCESS)

task_sent_handler 被触发,task_postrun_handler 未被触发。

signals.py 由我的AppConfig 导入,在ready() 函数内。

这是我的芹菜配置:

CELERY_BROKER_URL = env('CELERY_BROKER_URL')
CELERY_SEND_EVENTS = True
CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND')
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

关于为什么task_postrun 可能不会被解雇的任何建议?

它们都是任务类别下的事件,所以我不明白为什么一个有效而另一个无效。

【问题讨论】:

  • 是的,您通常必须确保“手动”连接您的信号。参见例如stackoverflow.com/questions/7115097/…
  • 您在哪个模块中导入信号?该模块可能只在发送任务的进程中执行(从而发出after_task_publish信号),而不是在运行任务的进程中(发出task_postrun信号)。
  • @schwobaseggl 我在models.py 中导入信号,后来将它移到我的celery.py 文件中。除了导入之外,我没有对它做任何事情。
  • 另外,信号是由 celery 发出的,所以我不确定为什么加载信号的模型很重要?
  • 已更新问题以删除 signals.py 部分

标签: python django celery django-celery


【解决方案1】:

配置是正确的,不知何故在系统重新启动后,CONNECT 打印开始出现在 celery 任务日志中..

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2022-11-16
    • 2017-04-14
    • 2015-10-19
    • 1970-01-01
    • 2012-11-13
    • 2021-04-25
    • 2015-10-09
    • 2020-06-29
    相关资源
    最近更新 更多