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

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

Поэтому, как только первый вызов / задача будет завершен, я хочу, чтобы следующий из них погас.

Я посмотрел настройки CELERY_ALWAYS_EAGER , но он просто прошел первую итерацию и остановился.

@task def reminder(number): # CODE THAT CALLS NUMBER HERE.... def make_calls(request): for number in phone_numbers: reminder.delay(number) return redirect('live_call_updates') 

2 Solutions collect form web for “Создавайте задачи сельдерея, затем выполняйте синхронно”

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

 @task def make_a_lot_of_calls(numbers): for num in numbers: # Assuming that reminder blocks till the call finishes reminder(number) def make_calls(request): make_a_lot_of_calls.delay(phone_numers) return redirect('live_call_updates') 

Если вы посмотрите на DOCS сельдерея на задачи, вы увидите, что для синхронного вызова задачи вы используете метод apply (), а не метод apply_async ().

Поэтому в вашем случае вы можете использовать:

  reminder.apply(args=[number]) 

DOCS также отмечает, что:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

Спасибо @JivanAmara, который в комментариях повторил, что при использовании apply () задача будет выполняться локально (на сервере / компьютере, на котором ее вызывается). И это может иметь последствия, если вы планируете выполнять свои задачи на нескольких серверах / машинах.

  • Добавьте n задач в очередь сельдерея и дождитесь результатов
  • Celery + Django: не удается запустить celerybeat в Windows 7
  • Невозможно рассолчать: поиск атрибута builtin.function не удался
  • Рабочий начинает, затем выключается. Нет ошибок
  • Python Celery против библиотеки Threading для запуска асинхронных запросов
  • django celery: как настроить задачу для выполнения в определенном интервале программным путем
  • Почему выполнение запланированных задач с сельдереем предпочтительнее crontab?
  • Как обеспечить задачу Сельдерея - Предотвращение дублирования задач на сельдерей
  •  
    Interesting Posts for Van-Lav

    Как скомпилировать OpenGL с расширением C ++ python с использованием distutils на Mac OSX?

    Создание / включение Boost.Python в VS2013

    Django models.CommaSeparatedIntegerField с формами. CheckboxSelectMultiple widget

    Django – Создайте ZIP-файл из нескольких файлов и сделайте его загружаемым

    Длительный опрос в Django

    Почему я получаю только один параметр из набора statsmodels OLS

    Как сделать осмысленный анализ покрытия кода моих модульных тестов?

    Как удалить светло-серая рамка вокруг моего виджета Canvas?

    скрипт, который добавляет пакеты для импорта sys.path как ожидалось при запуске с ipython, но генерирует исключение, когда скрипт запускается из python

    ошибка при записи текстового файла в python

    UnicodeEncodeError только при работе в качестве задания cron

    Передача формы с помощью python

    Элементная компоновка для вычисления среднего значения в Python / NumPy

    Токизация арабских слов с использованием NLTK

    многопроцессорные схемы графического интерфейса для борьбы с блокировкой «Неответ»

    Python - лучший язык программирования в мире.