Django / Celery : Как задача может постоянно что-то делать? Можно ли установить бесконечный цикл для задачи?
Я сейчас изучаю Django и Celery. Мне нужно сделать одну функцию для проекта Django, и я использую Celery для этого: мне нужно постоянно проверять список в моем Redis
сервере.
Для этого я использую Celery, но не знаю, как правильно это реализовать, и выбрал while True:
.
После запуска моей задачи с помощью celery -A <my_project> worker -l INFO
невозможно убить задачу (CTRL + C
не работает), или я не знаю, как это можно сделать. Я пришел к выводу, что это не лучший способ сделать то, что я хочу.
Еще один момент: я знаю, что расширение django-celery-beat
существует, но мне кажется "странным" открывать еще один терминал для запуска этого расширения. Уже сейчас мне приходится запускать мой сервер django, затем мой рабочий (с celery) на двух разных терминалах, мне приходится открывать третий для запуска запланированной задачи, я не знаю, действительно ли это странно, но... Я не знаю, я думаю, что это странно, но я не знаю, действительно ли это так.
Вот моя (уникальная) задача в app
в моем проекте django :
from celery import shared_task
import redis, time
@shared_task
def watcher():
client = redis.Redis('localhost', port=6379, decode_responses=True)
queue = 'queue'
lock_key = 'watcher_key'
try:
client.delete(queue)
if client.get(lock_key):
print('The matchmaking is already launch.')
return
client.set(lock_key, 'true')
while True:
in_queue = client.lrange(queue, 0, -1)
print(f'\'{queue}\': {in_queue}')
time.sleep(1)
# don't even know what condition I can put for breaking the loop
except Exception as e:
print(f'ERROR REDIS: {e}')
return
finally:
client.delete(lock_key)
Проблема : Я не знаю/нашел, как я могу постоянно проверять список в моем Redis
сервере с помощью хорошего метода, если django-celery-beat
является единственным решением, я пойду с ним.
Итак, я обращаюсь к вам за помощью, пожалуйста
Заранее всем спасибо!
Правильно, на самом деле мы не хотим запускать команду для рабочего celery. Теоретически вы могли бы запустить его в контейнере Docker или Kubernetes, но, вероятно, вы не захотите делать ничего подобного.
Лучшим способом запуска рабочего является настройка расписания с помощью стандартного администрирования Django. Вам нужно будет обязательно перенести модели django-celery-beat
, чтобы вы могли настроить различные типы задач в админке.
Для настройки администрирования по умолчанию, пожалуйста, следуйте странице 2 из учебника. и при необходимости обратитесь к документации сайта администрирования Django.
После того как вы его настроите, вы сможете устанавливать задачи на основе всевозможных событий. По таймерам, определенному времени или даже восходу солнца.
Для того чтобы функции, настроенные в celery.py
, могли использоваться в администрировании по умолчанию, не забудьте добавить декоратор @shared_task
. Вот пример:
# Runs once everyday to check if there are any subscriptions to be updated
# SecureSign.celery.task_check_free_trial
from celery import shared_task
@shared_task(expires=45)
def task_check_free_trial():
print('Checking Free Trial...')
morningCheckFreeTrial()
Чтобы установить периодическую задачу, войдите в систему и добавьте свою задачу там, где показана модель периодических задач, и добавьте желаемый период времени для повторного выполнения задачи или выберите "одноразовая задача". При вводе имени задачи celery обращайтесь к ней следующим образом:
DjangoMainAppNameOrFolderName.CeleryFile.Function
Мне нравится комментировать это прямо над функцией, чтобы вы знали, что вводить в админку при настройке задач. Как вы можете видеть, мое название :
SecureSign.celery.task_check_free_trial
Удачи, дайте мне знать, если у вас возникнут вопросы!