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

Асинхронная задача с сельдереем и кроликом

Личное примечание о том, как реализовать асинхронные задачи на Python с сельдереем и Rabbitmq. Tagged с Python.

Медленные ответы API? Тайм -ауты браузера?

Возможно, у вас есть очень медленные процессы, такие как внешние вызовы API, электронные письма или SMS -сервисы и т. Д., Которые не нужно обрабатывать синхронно, прежде чем фактически возвращать ответ ОК.

На прошлой неделе я испытываю, что * неловкий * пауза/сайт висит/бесконечная загрузка/«несколько мгновений спустя», когда я демонстрирую свое приложение на нашем QA. Я не ожидал, что это будет похоже на то, что, честно говоря, я никогда не испытывал этого на своей местной машине. Оказывается, моя обработка висит на моей части электронной почты, в которой я должен выполнить запрос на нашем почтовом сервере через SMTP. Время отклика очень непоследовательное, и если почтовый сервер не отвечает или на мой процесс тайм -ауты, мое приложение остается в этом висящем состоянии.

Не беспокойся больше! Потому что комбинация кролика X сельдерея здесь для вас. RabbitMQ будет использоваться в качестве брокера сообщения. В нем хранится очередь задач, а затем один за другим выполняется сельдереем. Как это использовать? У меня здесь простой питон, который демонстрирует его.

Во -первых, вы должны установить сельдерей и Rabbitmq:

pip install celery==4.0.2
sudo apt-get install -y rabbitmq-server

Затем создайте скрипт с именем task.py:

Touch Tasks.py

На задачах.py инициализируйте сельдерей:

from celery import Celery
app = Celery('tasks', broker='amqp://localhost//')

Затем создайте метод, украсьте его своим объектом сельдерея, чтобы он был распознан с помощью сельдерея.

@app.task
def create_a_slow_process_needs_async(job_name):
    print('Async job {}'.format(job_name))

После этого вам нужно начать работник сельдерея:

celery -A tasks worker  --loglevel=info


------------------- celery@zorexsalvo v4.0.2 (latentcall)
--------- **** -----
-------- * ***  * -- Linux-4.4.0-78-generic-x86_64-with-elementary-0.4.1-loki 2017-06-21 16:42:32
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x7fd374ebb210
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
-------- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery

[tasks]
  . tasks.reverse

[2017-06-21 16:42:32,523: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-06-21 16:42:32,529: INFO/MainProcess] mingle: searching for neighbors
[2017-06-21 16:42:33,545: INFO/MainProcess] mingle: all alone
[2017-06-21 16:42:33,556: INFO/MainProcess] celery@zorexsalvo ready.

Затем попробуйте выполнить работу в оболочке:


Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tasks
>>> tasks.create_a_slow_process_needs_async.delay('Send email blast!!')

Оригинал: “https://dev.to/zorexsalvo/asynchronous-task-with-celery-and-rabbitmq”