Знакомство с celery

19 марта 2020 00:00
225
0

Знакомство с селери в pythonПри разработке приложений часто возникает необходимость выполнять какие-то задачи в фоне. Например запускать периодически очистку временных файлов или разгрузить основной поток запроса, чтоб быстрее вернуть клиенту ответ. Для python написано множество библиотек позволяющих это сделать, но стандартных де-факто в этой области принято считать celery.

Для начала необходимо установить библиотеку из репозитория, используя pip, easy_install или напрямую скачав из github. Также для работы понадобиться брокер (для хранения задач и результата их выполнения). Стандартом здесь является rabbitmq, но также есть алтернативные варианты, например: redis, amazon sqs или zookeper. Последний, на момент написания статья помечен как experimental.

Чтобы понять как работать с сelery, нужно понять что это за библиотека и как она устроена. Селери представляет собой очередь задач. Рассмотрим пример обращения к VK-API при помощи очереди задач.

import requests from celery import Celery

#брокером выступает redis

app = Celery('tasks', broker='redis://localhost')

@app.task 
def make_request(method, params):
    api_url = 'https://api.vk.com/method/{0}'.format( method )
    requests.get(api_url, params=params)

Выполнить этот таск достаточно просто (предполагается что для построения ответа использован класс HttpResponse, как это делается в django):

task_call = make_request.delay('messages.send', {'access_token':'a8ef…',…})
return HttpResponse('ok')

Если написать его при обработке http-запроса, то пользователь не будет дожидаться пока выполниться метод requests.get, а сразу получит ответ. Delay — в даном случае является урезанным вариантом для метода apply_async. Последние позволяет, не только вызывать таск на выполнения, но и задавать дополнительные параметры выполнения. Рассмотрим самые интересные из них:

  • args (tuple), kwargs (dict) – параметры которые будут переданы самому таску.
  • countdown (float) – на сколько секунд отложить выполнение
  • eta (datetime) – в какое конкретно время запустить задачу
  • expires (float, datetime) – время жизни запускаемого таска.
  • retry (bool) — количество попыток выполнения задания.

Для примера вызовем уже упомянутый выше таск, но отложим его выполнение на 5 минут:

make_request.apply_async(['messages.send', {'access_token':'a8ef…',…}],countdown=300)

Похожие статьи