Планирование ежедневных задач Django-Celery на Windows Server - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужно запланировать задание на запуск с понедельника по субботу.Я скачал django-сельдерей, чтобы выполнить задачу.Я следовал учебному пособию на сайте Celery и использовал и просмотрел несколько сообщений о переполнении стека, например: здесь & здесь

Я сделал микс и сопоставил с вышеупомянутыми постами и с этими двумя великолепными уроками: Rhatore и Freitas

Это моя структура папок:

Application
    | apps
         | app1
              | __init__.py
              | tasks.py
              | urls.py
              | views.py    
    | Application
         | __init__.py
         | celery.py
         | settings.py
         | urls.py
         | wsgi.py

Settings.py

INSTALLED_APPS = [
    'django_celery_beat',
    'apps.app1',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True    
USE_TZ = True

CELERY_BROKER_URL = 'amqp://localhost'
CELERY_RESULT_BACKEND = 'amqp://localhost'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'

__ init __. Py В init в приложении

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

from .celery import app as celery_app

    __all__ = ('celery_app',)

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Application.settings')

app = Celery('Application')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

tasks.py - для простоты я сократил задачу до простой команды печати

from celery import shared_task
from celery.utils.log import get_task_logger
from celery.schedules import crontab
from celery.task import periodic_task
from celeryapp.emails import send_feedback_email
from django.http import HttpResponse
from .models import *

logger=get_task_logger(__name__)

@periodic_task(run_every=crontab(hour=21, minute=32, day_of_week=0-5))
def simple_print():
    print("Hello World!")

Я запустил:

celery -A Application -1 info

А потом python manage.py runserver 21:32 UTC прошло, и он не печатал.Я ожидал увидеть «Hello World», напечатанный в 21:32 UTC в терминале согласно задаче, указанной в tasks.py.Это не печатать.

Я также запускал:

celery -A Application worker -l info
celery -A Application beat -l info
python manage.py runserver

в разных терминалах.Он не выполнил задачу.

Руководство будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Код был верным.Проблема была из-за ОС.Я использую Windows, а Celery 4.0 не поддерживает Windows.Этот вопрос был очень полезен: Как запустить Celery в Windows .Я установил Gevent, и теперь он работает.

pip install gevent
celery -A Application beat -l info
celery -A Application worker -l info -P gevent

Если вы получили еще одну ошибку в строке «Неустранимая ошибка в программе запуска ...», попробуйте:

python -m celery -A Application beat -l info
python -m celery -A Application worker -l info -P gevent
0 голосов
/ 16 февраля 2019

Вам нужно запустить и рабочий, и ритм, чтобы сельдерей знал, нужно ли ему запускать периодическое задание в определенное время.

Что-то подобное должно помочь вам в вашей локальной среде.

celery -A Application worker -l info -B

Кроме того, вы можете запустить обоих работников как отдельные услуги

celery -A Application worker -l info

celery -A Application beat -l info
...