Рубрики
Без рубрики

Разоблачать задачу сельдерея

Сельдерей – это мощная очередь задач со многими великими функциями, уже встроенными. К сожалению, отчаявшись … Теги от сельдерея, Питона, Джанго, Редис.

Сельдерей Мощная очередь задач со многими великими функциями уже встроена. К сожалению, дебактирующие задачи не являются одним из них (или я не нашел его в документах), но, к счастью, это не так уж сложно построить его самостоятельно.

Что дебансинг

Что такое дебансинг, вы можете спросить? Давайте начнем с простого примера, который, хотя и непосредственно применимо к миру Python, следует облегчить понять концепцию. Скажем, у вас есть входной элемент на веб-странице. Чтобы реализовать автоматическое завершение, вы должны запрашивать API на стороне сервера с помощью ввода пользователя. Если бы вы сделали это на каждом нажатии на клавиш, вы, вероятно, будете жарить свой сервер. Вы, вероятно, хотите только отправить его, например, 500 мс после того, как пользователь перестал печатать.

Для этого вы можете запустить тайм-аут после нажатия клавиши, который, когда истек, запросит запрос сервера API. Вместо того, чтобы запускать отдельный тайм-аут после каждого нажатия клавиши, вы снова начиная о том же таймере и снова. Таким образом, время ожидания истекает и запросит сервер 500 мс после того, как пользователь перестал печатать.

Почему мне это нужно

Еще одно реальное применение – это так называемые функциональные возможности нисходящей линии связи на Datacake Отказ Datacake – это IOT-платформа, которая позволяет не только получать данные с устройств («uplink»), но и отправлять данные обратно на устройства («Dountlink»). Ниски на Datacake могут быть вызваны различными событиями, которые могут привести к той же нисходящей линии связи в течение короткого периода времени. Чтобы избежать этого, я реализовал Debounce (на этот раз для задачи сельдерея, наконец), чтобы отправить только последнюю нисходящую ссылку на данный период времени.

Используемые ингредиенты

Ссылки от самого сельдерея, я использовал Redis для хранения временного замка. Поскольку мы использовали Redis уже как наш брокер для сельдерея, он все равно был доступен.

Просто покажу мне код

Скажем, у вас есть такая задача, которую вы хотите отговорить:

@celery_app.task
def send_downlink(device, downlink):
    # Do some magic

Во-первых, я переименовал реальную задачу «частным, не использовать напрямую»:

@celery_app.task
def _send_downlink(device, downlink):
    # Do some magic

Затем я создал новую задачу с официальным именем, что увеличивает счетчик Redis, названный в честь уникального идентификатора для задачи, включая его аргументы (что вы хотите отговорить) каждый раз, когда он называется, и, наконец, расписание внутренней задачи с тайменами (ваш Время дебатации):

@celery_app.task
def send_downlink(device, downlink):
    redis_con.incr(f"debounce-downlink-{device}-{downlink}")
    _send_downlink.apply_async([device, downlink], countdown=1)

Наконец, в нашей внутренней задаче я уменьшаю счетчик и проверку, если новое значение, и в этом случае это «последний звонок» во время периода Дебат:

@celery_app.task
def send_downlink(device, downlink):
    if redis_con.decr(f"debounce-downlink-{device}-{downlink}") > 0:
        logger.debug(f"Debounce hit for {downlink} on {device}")
        return
    # Do some magic

Результатом является задача сельдерея, которую вы можете позвонить столько раз, сколько вы хотите, но только выполняется только после разрыва вызова вашего набора времени ожидания.

Оригинал: “https://dev.to/lukasklein/debouncing-a-celery-task-6pl”