Задачи Celery выполняются несколько раз в приложении Django - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть приложение Django, в котором я определил несколько @task функций в task.py, которые будут выполняться при заданной периодической задаче.Я на 100% уверен, что проблема вызвана не task.py или каким-либо кодом, но из-за какой-то конфигурации может быть в settings.py или у моего рабочего из сельдерея.

Задача выполняется при периодической задаче, но принесколько раз.

Вот журналы работника сельдерея:

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выполняет одну задачу, но 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
  • Пожалуйста, помогите мне способы отладки проблемы:

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Для выполнения периодической задачи необходимо одновременно запускать службы как работника, так и службы ритма в соответствии с 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 решил мою проблему.
0 голосов
/ 24 сентября 2019

Из официальной документации: Обеспечение выполнения задачи только по одному за раз .

Кроме того, я надеюсь, что вы не работаете с несколькими работниками одинаково(celery -A cimexmonitor worker --loglevel=info -B -c 4), поскольку это означало бы, что у вас есть несколько ударов сельдерея, планируя выполнение заданий ... Короче - убедитесь, что у вас работает только один побег сельдерея!

...