芹菜节拍服务旧(已删除)任务

Posted

技术标签:

【中文标题】芹菜节拍服务旧(已删除)任务【英文标题】:Celery beat serving old (removed) task 【发布时间】:2017-01-16 19:39:24 【问题描述】:

supervisor 下,celery beat 为我的 Django 应用程序的 celery 工人提供定期任务。我有 4 个任务,task1task2task3task4。最近我做了第五个任务:task5

我的问题是我从我的工作人员中注释掉了task5,从 settings.py 中删除了它的提及并重新启动了 celerybeat 和我的 celery 工作人员。但我仍然看到task5 定期出现(自然会在工作人员的日志中抛出错误)。

为什么会发生这种情况,如何更新定期任务?


在 settings.py 中,我有:

    import djcelery
    djcelery.setup_loader()
    # config settings for Celery Daemon

    # Redis broker
    BROKER_URL = 'redis://localhost:6379/0'

    BROKER_TRANSPORT = 'redis'

    # List of modules to import when celery starts, in myapp.tasks form. 
    CELERY_IMPORTS = ('myapp.tasks', )  

    CELERY_ALWAYS_EAGER = False

    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
    #The backend is the resource which returns the results of a completed task from Celery. 6379 is the default port to the redis server.

    CELERY_ACCEPT_CONTENT = ['json']
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_IGNORE_RESULT=True

    from datetime import timedelta

    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

    CELERYBEAT_SCHEDULE = 
        'tasks.task1': 
            'task': 'tasks.task1',
            'schedule': timedelta(seconds=45),
        ,
        'tasks.task2': 
            'task': 'tasks.task2',
            'schedule': timedelta(seconds=60),  # execute every 60 seconds
            'args': (),
        ,
        'tasks.task3': 
            'task': 'tasks.task3',
            'schedule': timedelta(seconds=90),  # execute every 90 seconds
            'args': (),
        ,
        'tasks.task4': 
            'task': 'tasks.task4',
            'schedule': timedelta(seconds=90),  # execute every 90 seconds
            'args': (),
        ,
    

/etc/supervisor/conf.d/celerybeat.conf 包含以下内容:

command=python manage.py celery beat -l info
directory = /home/myuser/myproject/
environment=PATH="/home/myuser/envs/myenv/bin",VIRTUAL_ENV="/home/myuser/envs/myenv",PYTHONPATH="/home/myuser/envs/myenv/lib/python2.7:/home/myuser/envs/myenv/lib/python2.7/site-packages"
user=mhb11
numprocs=1
stdout_logfile = /etc/supervisor/logs/celerybeat.log
stderr_logfile = /etc/supervisor/logs/celerybeat.log
autostart = true
autorestart = true
startsecs=10
stopwaitsecs = 600
killasgroup=true
priority=999

如果您需要,请向我询问更多信息。提前致谢。

【问题讨论】:

【参考方案1】:

我相信您的队列中已经有待处理的任务。

您需要purge them。或者,如果您知道他们的 ID(请注意,除非您覆盖它,否则任务 ID 是唯一生成的......这些不是任务的名称),您也可以revoke them。

【讨论】:

清除/撤销任务的等效 Django 项目命令是什么? 我没有使用 django celery,所以我不确定,但我确实在网上找到了你可能会发现 python manage.py celery amqp queue.purge <queue_name> 在这种情况下很有用......我希望你会 谢谢,会检查一下。 @HassanBaig 只是友好的提醒 - 如果这个答案有用,请投票。如果它解决了您的问题,请接受为正确答案。谢谢! 我也面临同样的问题。有人可以向我解释清除队列的原因吗?清除是否有助于执行更新的代码?我们所有的待处理任务也会丢失,对吧?【参考方案2】:

另一个可能的原因是你正在使用

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

您的任务正在存储在您的数据库中,并且不会仅通过将其从 CELERYBEAT_SCHEDULE 中删除而被删除。

您需要删除或禁用不需要的定期任务(如果您已启用,可以通过管理员上的 djcelery 应用轻松完成)

https://docs.celeryproject.org/en/stable/userguide/configuration.html#std:setting-beat_scheduler

【讨论】:

以上是关于芹菜节拍服务旧(已删除)任务的主要内容,如果未能解决你的问题,请参考以下文章

芹菜节拍不接周期性任务

在任务中获取芹菜节拍触发时间

芹菜节拍:crontab 两次执行相同的任务(间隔 10 分钟)

Celery Beat:一次限制为单个任务实例

芹菜:访问上次运行任务的时间?

如果params和任务名称已在服务器中排队,是否可以跳过委托芹菜任务?