Говоря о косточке сельдерея

Django

celery

Использование celery и его настройка в Django подробно не будут представлены, но в основном записываются питы, используемые в Django.

яма

проблема с часовым поясом

Часовой пояс сельдерея по умолчанию — UTC, что на 8 часов медленнее, чем восточный восьмой округ.Если вы публикуете запланированное задание, вы должны обратить внимание на время, иначе может быть использован правильный метод, но вызов не будет успешным.

Установка часового пояса сельдерея может быть выполнена в проекте Django.settings.pyдобавить параметр в

CELERY_TIMEZONE = 'Asia/Shanghai'

django-celeryМожет распознать часовой пояс в настройках

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

# 将需要设定的时间转换成当前时区的时间
from django.utils.timezone import get_current_timezone
import datetime

send_time = datetime.datetime.now() + datetime.timedelta(days=1)
tz = get_current_timezone()
send_time = tz.localize(send_time)

Передайте преобразованное время в параметр при использовании асинхронных задач.

celery_task.apply_async(args=[], kwdg={}, eta=send_time)

Конечно, вы также можете использовать интервал времени для выполнения асинхронных задач, соответствующихapply_async()Параметр обратного отсчета внутри

celery_task.apply_async(countdown=seconds)

Проблема сериализации с сельдереем

Celery предоставляет два сериализованных формата:pickleа такжеjson, pickle — это библиотека сериализации для python, которая может реализовать сериализацию и десериализацию данных в различных форматах, соответствующих pickle и unpickle

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

# settings.py
# celery允许接收的数据格式,可以是一个字符串,比如'json'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
# 异步任务的序列化器,也可以是json
CELERY_TASK_SERIALIZER = 'pickle'
# 任务结果的数据格式,也可以是json
CELERY_RESULT_SERIALIZER = 'pickle'

В частности, в Django обратите внимание, что если вам нужно передать набор запросов, необходимо получить асинхронные задачи, а формат сериализации установлен на «рассол», т. Е. Как предусмотрено

Не рекомендуется передавать объект ORM в асинхронную задачу celery, данные могут быть просрочены, рекомендуется передавать id

результат

Если вам не нужно обрабатывать результаты выполнения асинхронных задач, то есть результаты выполнения асинхронных задач имеют мало общего с бизнес-логикой, рекомендуется не хранить результаты асинхронных задач celery.

Если результат сохраняется, сельдерей создаст очередь для результата задачи и будет ждать, пока асинхронная задача даст результат, прежде чем удалять задачу из очереди.Создание и управление задачами обходится дорого, как вы можете видеть в этом блоге:woowoooo.cn blogon.com/barack po...

Установите игнорирование результатов выполнения задачи сельдерея в настройках Django.

CELERY_IGNORE_RESULT = True

использовать другую очередь

Если задача A более важна, чем задача B, а объем задачи B очень велик, важной задаче A необходимо дождаться завершения задачи B, прежде чем продолжить.В это время для сохранения задач могут использоваться разные очереди и разные рабочие может выполнять две задачи

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('for_task_A', Exchange('for_task_A'), routing_key='for_task_A'),
    Queue('for_task_B', Exchange('for_task_B'), routing_key='for_task_B'),
)

Затем настройте маршрутизатор для выполнения различных задач.


CELERY_ROUTES = {
    'my_taskA': {'queue': 'for_task_A', 'routing_key': 'for_task_A'},
    'my_taskB': {'queue': 'for_task_B', 'routing_key': 'for_task_B'},
}

Затем при запуске сельдерея укажите другого работника

celery worker -E -l INFO -n workerA -Q for_task_A celery worker -E -l INFO -n workerB -Q for_task_B