Как запустить параллельную постановку задач с помощью 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, но это тема для другого вопроса :)