Как запустить параллельную постановку задач с помощью celery django?

Я хочу выполнять задачи параллельно с помощью django celery.

Допустим, следующая задача:

@shared_task(bind=True)
def loop_task(self):
    for i in range(10):
        time.sleep(1)
        print(i)
    return "done"

Каждый раз, когда загружается представление, должна выполняться эта задача :

def view(request):
    loop_task.delay()

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

Вот команда celery, которую я использую :

celery -A toolbox.celery worker --pool=solo -l info -n my_worker1


-------------- celery@my_worker1 v5.2.7 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.22000-SP0 2022-08-01 10:22:52
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         toolbox:0x1fefe7286a0
- ** ---------- .> transport:   redis://127.0.0.1:6379//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 8 (solo)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery

Я уже пробовал решения, найденные здесь, но ни одно из них, похоже, не делает того, что я прошу StackOverflow : Выполнение двух задач одновременно с помощью Celery

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

Все еще есть задание, не поступившее в очередь. Это зависит от количества рабочих и скорости выполнения.

И если результат тот же, вы можете установить его в кэш.

Я думаю, что это очень просто решить, но вам нужно проверить это.

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

send_mass_sms.apply_async(
    [
        phone_numbers,
        instance.body,
        instance.id,
    ],
    eta=instance.when,
)

Ваш код нужно исправить следующим образом:

def view(request):
    loop_task.apply_async()

Если вам нужно обновлять данные на сайте, вы можете хранить данные в моделях и вызывать ajax несколько раз или реализовать логику через websockets, но это тема для другого вопроса :)

Вернуться на верх