【问题标题】:Celery Tasks are executing multiple times in Django Application芹菜任务在 Django 应用程序中执行多次
【发布时间】:2020-01-21 13:55:29
【问题描述】:

我有一个 Django 应用程序,我在 task.py 下定义了一些 @task 函数,以在给定的周期性任务中执行。我 100% 确定问题不是由 task.py 或任何相关代码引起的,而是由于某些配置可能在 settings.py 或我的 celery worker 中。

任务确实在周期性任务中执行,但多次执行。

这里是芹菜工人的日志:

celery -A cimexmonitor worker --loglevel=info -B -c 4

[2019-09-19 21:22:16,360: INFO/ForkPoolWorker-5] Project Monitor Started : APPProject1
[2019-09-19 21:22:16,361: INFO/ForkPoolWorker-4] Project Monitor Started : APPProject1
[2019-09-19 21:25:22,108: INFO/ForkPoolWorker-4] Project Monitor DONE : APPProject1
[2019-09-19 21:25:45,255: INFO/ForkPoolWorker-5] Project Monitor DONE : APPProject1
[2019-09-20 00:22:16,395: INFO/ForkPoolWorker-4] Project Monitor Started : APPProject2
[2019-09-20 00:22:16,398: INFO/ForkPoolWorker-5] Project Monitor Started : APPProject2
[2019-09-20 01:22:11,554: INFO/ForkPoolWorker-5] Project Monitor DONE : APPProject2
[2019-09-20 01:22:12,047: INFO/ForkPoolWorker-4] Project Monitor DONE : APPProject2
  • 如果您检查上述时间间隔,tasks.py 会执行一项任务,但 celery 的 2 个工作人员会执行该任务并以相同的时间间隔执行相同的任务。我不知道为什么 2 名工人要完成一项任务?

  • settings.py

..
..
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Kolkata'

USE_I18N = True

USE_L10N = True

USE_TZ = True
..
..
..
######## CELERY : CONFIG
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
  • celery.py
from __future__ import absolute_import, unicode_literals
from celery import Celery 
import os
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE','cimexmonitor.settings')
## set the default Django settings module for the 'celery' program.

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.

app = Celery('cimexmonitor')
#app.config_from_object('django.conf:settings', namespace='CELERY') 
app.config_from_object('django.conf:settings')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
  • 其他信息:
→ celery --version
4.3.0 (rhubarb)

→ redis-server --version
Redis server v=3.0.6 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7785291a3d2152db

django-admin-interface==0.9.2
django-celery-beat==1.5.0
  • 请帮我解决问题的方法:

谢谢

【问题讨论】:

  • 您能否测试一下您的celery.py 文件是否在您的应用程序中被多次加载?
  • 感谢您的回复,我如何验证celery.py 是否被多次加载。
  • 你用什么命令来运行celerybeat
  • celery -A appname beat --loglevel=debug --scheduler django_celery_beat.schedulers:DatabaseScheduler 用于调度程序,celery -A appname worker --loglevel=info -B -c 4 用于工作人员。

标签: python django redis celery django-celery


【解决方案1】:

来自官方文档:Ensuring a task is only executed one at a time.

另外,我希望您不要以相同的方式运行多个工作人员 (celery -A cimexmonitor worker --loglevel=info -B -c 4),因为这意味着您有多个 celery beat 调度任务要运行...简而言之 - 确保您只有一个 Celery beat 运行!

【讨论】:

  • 那是另一种情况。
  • 我的答案的第二部分看起来与您接受的答案相同...我们只能猜测您的问题的原因是什么,结果我猜对了...
【解决方案2】:

worker 和 beat 服务需要同时运行才能按照https://github.com/celery/django-celery-beat定期执行任务

  • 工人:
 $ celery -A [project-name] worker --loglevel=info -B -c 5
  • Django 调度程序:
celery -A [project-name] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
  • 我同时运行两个工作程序、数据库调度程序,根据文档所述,这导致问题同时执行,我真的不确定celery worker 是如何开始工作的数据库调度程序。
  • 只是运行celery worker 解决了我的问题。

【讨论】:

  • 你的解决方案不会破坏 Celery Beat 吗?
猜你喜欢
  • 2022-01-21
  • 2013-02-11
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2014-02-11
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多