Я борюсь с Django, Celery, djcelery и PeriodicTasks.
Я создал задачу, чтобы получить отчет для AdSense, чтобы создать отчет о статистике в реальном времени. Вот моя задача:
import datetime
import httplib2
import logging
from apiclient.discovery import build
from celery.task import PeriodicTask
from django.contrib.auth.models import User
from oauth2client.django_orm import Storage
from .models import Credential, Revenue
logger = logging.getLogger(__name__)
class GetReportTask(PeriodicTask):
run_every = datetime.timedelta(minutes=2)
def run(self, *args, **kwargs):
scraper = Scraper()
scraper.get_report()
class Scraper(object):
TODAY = datetime.date.today()
YESTERDAY = TODAY - datetime.timedelta(days=1)
def get_report(self, start_date=YESTERDAY, end_date=TODAY):
logger.info('Scraping Adsense report from {0} to {1}.'.format(
start_date, end_date))
user = User.objects.get(pk=1)
storage = Storage(Credential, 'id', user, 'credential')
credential = storage.get()
if not credential is None and credential.invalid is False:
http = httplib2.Http()
http = credential.authorize(http)
service = build('adsense', 'v1.2', http=http)
reports = service.reports()
report = reports.generate(
startDate=start_date.strftime('%Y-%m-%d'),
endDate=end_date.strftime('%Y-%m-%d'),
dimension='DATE',
metric='EARNINGS',
)
data = report.execute()
for row in data['rows']:
date = row[0]
revenue = row[1]
try:
record = Revenue.objects.get(date=date)
except Revenue.DoesNotExist:
record = Revenue()
record.date = date
record.revenue = revenue
record.save()
else:
logger.error('Invalid Adsense Credentials')
Я использую Celery и RabbitMQ. Вот мои настройки:
# Celery/RabbitMQ
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "myuser"
BROKER_PASSWORD = "****"
BROKER_VHOST = "myvhost"
CELERYD_CONCURRENCY = 1
CELERYD_NODES = "w1"
CELERY_RESULT_BACKEND = "amqp"
CELERY_TIMEZONE = 'America/Denver'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
import djcelery
djcelery.setup_loader()
На первый взгляд кажется, что все работает, но после включения регистратора и наблюдения за его работой я обнаружил, что он запускает задачу по крайней мере четыре раза подряд, а иногда и больше. Также кажется, что он работает каждую минуту, а не каждые две минуты. Я пытался изменить run_every, чтобы использовать crontab, но получаю те же результаты.
Я начинаю celerybeat с помощью супервизора. Вот команда, которую я использую:
python manage.py celeryd -B -E -c 1
Любые идеи относительно того, почему он не работает должным образом?
О, и еще одна вещь: после смены дня он продолжает использовать диапазон дат, с которым он работал в первый раз. Таким образом, с течением времени он продолжает получать статистику за день, когда задача начала выполняться - если я не запустил задачу вручную в какой-то момент, она изменится на дату, когда я последний раз запускал ее вручную. Может кто-нибудь сказать мне, почему это происходит?