Модели Джанго и сельдерея периодические задания - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над проектами IoT с Django. Мне не нравится заниматься утомительным кодированием. Проблема в том, что у меня есть название модели Период, подобный этому:

class Period(models.Model):
      number = models.PositiveIntegerField(primary_key=True)
      start_time = models.TimeField()
      end_time = models.TimeField()

Кроме того, я хочумой сельдерей бился, чтобы сделать что-то в Period.end_time, и я добавляю этот код.Код в mysite / app / tasks.py.

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    all_periods = Period.objects.all()
    for period in all_periods:
        hour = period.end_time.hour
        minute = period.end_time.minute
        sender.add_periodic_task(
            crontab(hour=hour, minute=minute),
            do_some_thing.s()
        )
@task
def do_some_thing():
      #do_some_thing

Вот другие файлы:

#mysite/mysite/celery.py
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'smartschool.settings')
app = Celery('smartschool')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
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))

#mysite/mysite/__init__.py
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__=['celery_app']

#mysite/mysite/settings.py ##Celery part.
CELERY_BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'rpc://'
CELERY_ACCEPT_COTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Ho_Chi_Minh'
CELERY_IMPORT = ('timetable.tasks')
CELERY_BEAT_SCHEDULE = {
    #'test':
    #{
    #    'task': 'timetable.tasks.hello',
    #    'schedule': 10.0,
    #},
    'system_on':
    {
        'task': 'timetable.tasks.system_on',
        'schedule': crontab(hour=7, minute=0)
    },
    'system_off':
    {
        'task': 'timetable.tasks.system_off',
        'schedule': crontab(hour=17, minute=30)
    },
}

Периодические задачи, добавленные удобно в CELERY_SHEDULE_BEAT, работали нормально, но задачи, добавленные функцией add_periodic_taskне сделал.Английский не мой родной язык;прошу прощения за любые ошибки в моем сообщении.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Также есть еще один способ запуска заданий crontab:

@task
def my_task():
   //your code 

и ваш celery.py файл

app.conf.beat_schedule = {
    'my_task': {
        'task': 'Path.tasks.my_task',
        'schedule': crontab(minute='*/5'),
        'args': []
    },
}
0 голосов
/ 12 сентября 2018

Я думаю, я понял. Изменяя @ task.on_after_configure.connect на @ task.on_after_finalize.connect, функция add_periodic_task работает, однако добавлена ​​только одна задача, в то время как у меня есть 11 экземпляров Period!

0 голосов
/ 12 сентября 2018

Вы можете использовать @periodic_task decorator до вашей задачи crontab, и после запуска вашего проекта вы должны запустить этот код. celery -A YOURPROJETNAME worker -l -b info

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...