在 Heroku 上运行的 Celery beat 进程发送任务两次

Posted

技术标签:

【中文标题】在 Heroku 上运行的 Celery beat 进程发送任务两次【英文标题】:Celery beat process running on Heroku sends task twice 【发布时间】:2014-04-14 09:47:07 【问题描述】:

我有一个定期任务被发送两次。我一直无法找出原因。

Celery 配置(部分):

app.conf.CELERYBEAT_SCHEDULE = 
    'email-todays-todos': 
        'task': 'apps.todo.tasks.email_todays_todos',
        'schedule': crontab(hour='7', minute='30')
    ,
    'send-onboarding-emails': 
        'task': 'apps.home.tasks.send_onboarding_emails',
        'schedule': crontab(hour='13', minute='0')
    ,

第一个周期性任务 (email_todays_todos) 发送一次没有问题,但第二个 (send_onboarding_emails) 发送两次。

我的档案:

web: gunicorn appname.wsgi
worker: celery -A appname worker -l info
beat: celery -A appname beat

以下是日志中发生的情况:

Mar 10 11:00:00 appname app/beat.1:  [2014-03-10 13:00:00,162: INFO/MainProcess] Scheduler: Sending due task send-onboarding-emails (apps.home.tasks.send_onboarding_emails) 
Mar 10 11:00:00 appname app/beat.1:  [2014-03-10 13:00:00,101: INFO/MainProcess] Scheduler: Sending due task send-onboarding-emails (apps.home.tasks.send_onboarding_emails) 
Mar 10 11:00:00 appname app/worker.2:  [2014-03-10 13:00:00,259: INFO/MainProcess] Received task: apps.home.tasks.send_onboarding_emails[a4dcb6ff-fa40-4a9c-beba-21c62b0bd5e5] 
Mar 10 11:00:01 appname app/worker.1:  [2014-03-10 13:00:00,450: INFO/MainProcess] Received task: apps.home.tasks.send_onboarding_emails[f97c546d-5876-4152-8344-96bd05c546b1] 
Mar 10 11:00:05 appname app/worker.2:  [2014-03-10 13:00:05,564: INFO/MainProcess] Task apps.home.tasks.send_onboarding_emails[a4dcb6ff-fa40-4a9c-beba-21c62b0bd5e5] succeeded in 5.00695208088s: True 
Mar 10 11:00:07 appname app/worker.1:  [2014-03-10 13:00:05,455: INFO/MainProcess] Task apps.home.tasks.send_onboarding_emails[f97c546d-5876-4152-8344-96bd05c546b1] succeeded in 4.76427294314s: True 

我有 2 个 dyno 为工作进程运行,1 个 dyno 为节拍进程运行。

这里有什么想法吗?

【问题讨论】:

您找到解决方案了吗?我正在使用两个不同的 heroku 应用程序来体验这一点。 【参考方案1】:

我遇到了类似的问题。不确定这是否对您有用,但我最终从我的设置文件中删除了 CELERYBEAT_SCHEDULE,而是在我的 tasks.py 文件中创建了一个定期任务。只需像这样装饰您要运行的功能:

@periodic_task(run_every=timedelta(seconds=30))

我每 30 秒运行一次,但您可以将其更改为您想要的任何间隔。

【讨论】:

以上是关于在 Heroku 上运行的 Celery beat 进程发送任务两次的主要内容,如果未能解决你的问题,请参考以下文章

使用 celery-beat 完成上一个任务后,如何在 5 分钟内运行任务?

永久激活 cpanel 主机上的 celery worker 和 celery beat

在 heroku 上运行 celery 的最佳实践

在同一个容器中运行 celery worker + beat

防止 Celery Beat 运行相同的任务

Heroku/Celery:一名工人同时执行任务?