От новичка до гуру: Курсы программирования на CyberDuff

Запускайте задачи сельдерея одновременно с помощью pytest

Я пытаюсь выполнить интеграционное тестирование параллельной задачи сельдерея в своем приложении Django. Я хочу, чтобы задача фактически выполнялась одновременно на рабочем месте во время интеграционного теста pytest, но у меня возникли проблемы с этой работой.

Скажем, у меня есть следующая основная задача сельдерея:

@shared_task
def sleep_task(secs):
    print(f"Sleeping for {secs} seconds...")
    for i in range(secs):
        time.sleep(i)
        print(f"\t{i + 1}")
    return "DONE"

Параллельный запуск задачи в скрипте работает нормально:

# script
sleep_task.delay(3)
sleep_task.delay(3)

# output
Sleeping for 3 seconds...
Sleeping for 3 seconds...
1
1
2
2
3
3

Однако я не могу воспроизвести это асинхронное поведение в модульном тесте. В conftest.py я настраиваю брокера и серверную часть результатов:

import pytest

pytest_plugins = ("celery.contrib.pytest",)

@pytest.fixture(scope="session")
def celery_config():
    return {"broker_url": "memory://", "result_backend": "rpc://"}

И вот мой модульный тест. celery_session_app и celery_session_worker настраивают приложение celery и рабочий процесс, используемый для тестирования (документы):

def test_concurrent_sleep_tasks(celery_session_app, celery_session_worker):
    sleep_task.delay(3)
    sleep_task.delay(3)

# output
Sleeping for 3 seconds...
1
2
3
Sleeping for 3 seconds...
1
2
3

Похоже, задачи выполняются синхронно. Есть ли способ запускать задачи асинхронно?


  • Я бы предположил, что проблема связана с time.sleep(3), который блокирует выполнение всего скрипта. Можете ли вы переключиться на неблокирующий asyncio.sleep(3) и посмотреть, сработает ли это? 23.02.2021

Ответы:


1

celery_session_worker запускает celery worker с параллелизмом 1. Это жестко закодирован в celery.contrib и в настоящее время не настраивается. Поскольку параллелизм равен 1, он будет обрабатывать только 1 задачу за раз.

Альтернативное решение — написать собственное приспособление для запуска рабочего процесса с параллелизмом 2 или более.

25.02.2021
  • Написал свое собственное рабочее приспособление с параллелизмом, установленным на 2, но не повезло. Похоже, мне нужно пойти обычным путем, запустив очередь и работника во время моего запуска pytest, чтобы заставить это работать, что не так уж плохо. 01.03.2021
  • Новые материалы

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

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..