Проблема с django-celery, не работающим в определенное время

У меня проблемы с тем, что django-celery не запускается в указанное время, но он всегда запускается каждую минуту. Ниже я вставил tasks.py, settings.py и celery.py. Я тестировал с djcelery, а также с сельдереем. Я использую сельдерейный бит.

celery.py (отредактировано, чтобы дать конкретную и избежать конфиденциальной информации.): -

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery
from django.conf import settings
from celery.schedules import crontab
from datetime import timedelta



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

app = Celery('netadc')
app.config_from_object(settings, namespace='CELERY')
app.autodiscover_tasks()

app = Celery('proj',
             broker='redis://',
             backend='redis://',
             include=['standalone.tasks'])



CELERY_BEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.cron_span",
        "schedule": 30.0,
        "args": ()
    },
}

if __name__ == '__main__':
    app.start()

settings.py: -

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home',
    'ivpn',
    'nsp',
    'lib',
    'ciscoaci',
    'standalone',
    'arista',
    'spa',
    'inet',
    #'django_countries',
    'djcelery',
    #'debug_toolbar',
    'celery',
    'django_celery_beat',
)

ROOT_URLCONF = 'netadc.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'ivpn.context_processors.vpnreq_info',
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                #'django.core.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'netadc.wsgi.application'

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

LANGUAGE_CODE = 'en-us'

#TIME_ZONE = 'UTC'
TIME_ZONE = 'America/Phoenix'

USE_TZ = True

## Celery specific settings
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'redis://'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Phoenix'
CELERY_ENABLE_UTC = True

tasks.py: -

from __future__ import absolute_import, division, print_function
# -*- coding: utf-8 -*-
from __builtin__ import *
#from future.builtins.disabled import *
from django.template.context_processors import csrf
from django.http import Http404
from django.shortcuts import get_object_or_404,render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
# Create your views here.
from django.shortcuts import render
#from django.urls import 
from django.core.urlresolvers import reverse
import json
import os
import requests
import argparse
import collections
import datetime
from django.template import RequestContext
from standalone.forms import UploadFileForm
from django.contrib import messages
#import pyexcel.ext.xls
import urllib
import urllib2
import cookielib
import sys, getopt
import StringIO,contextlib
import xml.etree.ElementTree as ET
from standalone.views import *
from standalone.models import Fabric, Span
#from celery.decorators import task
from celery import task
from celery.utils.log import get_task_logger
from celery import shared_task
from celery.schedules import crontab
from celery.decorators import periodic_task
from time import time as time1
import time
from datetime import timedelta
import datetime

logger = get_task_logger(__name__)
@task()
def cron_span():
      ########### code #############################

Я изменил часовой пояс, чтобы он был одинаковым во всех местах, и я также обновил планировщик базы данных, используя команды: - from djcelery.models import PeriodicTask PeriodicTask.objects.update (last_run_at = None)

Любая помощь будет оценена.

поленья сельдерея: -

[2018-03-18 11:09:55,078: INFO/Beat] Writing entries...
[2018-03-18 11:10:00,001: INFO/Beat] Scheduler: Sending due task standalone.tasks.cron_span (standalone.tasks.cron_span)
[2018-03-18 11:10:00,003: INFO/MainProcess] Received task: standalone.tasks.cron_span[707c0da7-d76b-4c4d-92a4-3839f5cd6527]  
[2018-03-18 11:10:00,005: WARNING/ForkPoolWorker-2] where are we
[2018-03-18 11:10:00,011: WARNING/ForkPoolWorker-2] each_all_values
[2018-03-18 11:10:00,011: WARNING/ForkPoolWorker-2] <type 'datetime.datetime'>
[2018-03-18 11:10:00,011: WARNING/ForkPoolWorker-2] each_all_values.time_span
[2018-03-18 11:10:00,012: WARNING/ForkPoolWorker-2] <type 'float'>
[2018-03-18 11:10:00,012: WARNING/ForkPoolWorker-2] present_time
[2018-03-18 11:10:00,013: ERROR/ForkPoolWorker-2] Task standalone.tasks.cron_span[707c0da7-d76b-4c4d-92a4-3839f5cd6527] raised unexpected: ValueError('invalid literal for float(): 2018-03-12 21:22:05',)
Traceback (most recent call last):
  File "/root/.venvs/netadc/lib/python2.7/site-packages/celery-4.1.0-py2.7.egg/celery/app/trace.py", line 374, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/root/.venvs/netadc/lib/python2.7/site-packages/celery-4.1.0-py2.7.egg/celery/app/trace.py", line 629, in __protected_call__
    return self.run(*args, **kwargs)
  File "/apps/workspace/netadc/standalone/tasks.py", line 57, in cron_span
    time_taken = present_time - float(each_all_values.time_span.strftime("%Y-%m-%d %H:%M:%S")) # time_taken is in seconds
ValueError: invalid literal for float(): 2018-03-12 21:22:05



[2018-03-18 11:11:00,001: INFO/Beat] Scheduler: Sending due task standalone.tasks.cron_span (standalone.tasks.cron_span)
[2018-03-18 11:11:00,004: INFO/MainProcess] Received task: standalone.tasks.cron_span[23928119-c93a-41c5-9bc7-e2c909324b6f]  
[2018-03-18 11:11:00,005: WARNING/ForkPoolWorker-5] where are we
[2018-03-18 11:11:00,012: WARNING/ForkPoolWorker-5] each_all_values
[2018-03-18 11:11:00,012: WARNING/ForkPoolWorker-5] <type 'datetime.datetime'>
[2018-03-18 11:11:00,012: WARNING/ForkPoolWorker-5] each_all_values.time_span
[2018-03-18 11:11:00,012: WARNING/ForkPoolWorker-5] <type 'float'>
[2018-03-18 11:11:00,013: WARNING/ForkPoolWorker-5] present_time
[2018-03-18 11:11:00,014: ERROR/ForkPoolWorker-5] Task standalone.tasks.cron_span[23928119-c93a-41c5-9bc7-e2c909324b6f] raised unexpected: ValueError('invalid literal for float(): 2018-03-12 21:22:05',)
Traceback (most recent call last):
  File "/root/.venvs/netadc/lib/python2.7/site-packages/celery-4.1.0-py2.7.egg/celery/app/trace.py", line 374, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/root/.venvs/netadc/lib/python2.7/site-packages/celery-4.1.0-py2.7.egg/celery/app/trace.py", line 629, in __protected_call__
    return self.run(*args, **kwargs)
  File "/apps/workspace/netadc/standalone/tasks.py", line 57, in cron_span
    time_taken = present_time - float(each_all_values.time_span.strftime("%Y-%m-%d %H:%M:%S")) # time_taken is in seconds
ValueError: invalid literal for float(): 2018-03-12 21:22:05

person Sindhujit    schedule 16.03.2018    source источник


Ответы (2)


Если вы хотите запускать задачу каждые 30 секунд, вам следует сделать:

CELERY_BEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.cron_span",
        "schedule": timedelta(seconds=30),
        "args": ()
    },
}

для старых версий сельдерея.

person trinchet    schedule 16.03.2018
comment
Вы говорите, что задача выполняется каждую минуту? вы можете разместить журналы сельдерея? - person trinchet; 17.03.2018
comment
обновил мой исходный вопрос журналами сельдерея .. команда использует celery -A netadc worker --beat -l info --scheduler django_celery_beat.schedulers: DatabaseScheduler - person Sindhujit; 18.03.2018
comment
Да, он работает каждую минуту, несмотря на указанное время. - person Sindhujit; 18.03.2018
comment
Пожалуйста, зайдите в консоль и введите from django.conf import settings;settings.CELERY_BEAT_SCHEDULE, чтобы проверить, какое именно значение там указано. - person trinchet; 19.03.2018
comment
Я получаю сообщение об ошибке: - ImportError: нет модуля с именем djago.conf ››› из настроек импорта django.conf ››› settings.CELERY_BEAT_SCHEDULE Отслеживание (последний вызов последний): файл ‹console›, строка 1, в файле ‹module› /root/.venvs/netadc/lib/python2.7/site-packages/Django-1.11-py2.7.egg/django/conf/__init__.py, строка 57, в getattr val = getattr (self._wrapped, name) AttributeError: объект «Настройки» не имеет атрибута «CELERY_BEAT_SCHEDULE» - person Sindhujit; 20.03.2018
comment
это from django.conf import settings, вы пропустили n. Кажется, у вас где-то в проекте неправильная ссылка, выполните поиск djago.conf - person trinchet; 20.03.2018
comment
Извините за путаницу. Это была первая команда, а затем возникла ошибка. После этого, если вы видите, что я упомянул django.conf, и он выдает ошибку, что не может найти CELERY_BEAT_SCHEDULE .. - person Sindhujit; 20.03.2018
comment
Вот в чем проблема, вы должны включить CELERY_BEAT_SCHEDULE в свой файл настроек, а не в celery.py - person trinchet; 20.03.2018
comment
Он по-прежнему не работает :( .. расписание ударов, похоже, выполняется. ››› из настроек импорта django.conf ››› settings.CELERY_BEAT_SCHEDULE {'запускается каждые 30 секунд': {'задача': 'задачи. cron_span ',' args ': (),' schedule ': datetime.timedelta (0, 30)}} - person Sindhujit; 20.03.2018
comment
Вы удалили все .pyc, удалили CELERY_BEAT_SCHEDULE из своего celery.py файла и перезапустили сельдерей? - person trinchet; 20.03.2018
comment
Да, я закомментировал CELERY_BEAT_SCHEDULE из моего celery.py и удалил celery.pyc. И перезапустил бит-сервис - person Sindhujit; 20.03.2018
comment
Пишу свои задачи в tasks.py. Однако в документации они определили его как celery.py. Это может вызвать проблему? - person Sindhujit; 21.03.2018

Убедитесь, что в вашем settings.py файле установлен CELERY_ENABLE_UTC = False, иначе сельдерей преобразует ваши расписания в UTC.

person Vikram Singh Chandel    schedule 27.02.2020