2016-08-12 4 views
3

Я создаю задачу сельдерея в ситуации, когда производители задач больше, чем потребители (рабочие). Теперь, когда мои очереди заполняются, а рабочие потребляют в FCFS, могу ли я выполнить конкретную задачу (заданную task_id) мгновенно?Сельдерей - Задача task_id, выполнить задачу

для например: -

Мои задачи заполняются следующим образом. [1,2,3,4,5,6,7,8,9,0]. Теперь задачи извлекаются из нулевого индекса. Теперь возникает ситуация, когда я хочу выполнить задачу 8 прежде всего. Как я могу это сделать?

Работник не должен выполнять эту задачу (потому что может быть ситуация, когда рабочий уже занят). Его можно запустить непосредственно из приложения. И когда задача завершена (либо из рабочего, либо непосредственно из приложения), она должна быть удалена из очереди.

Я знаю, как принудительно отменять задание (задано task_id), но как я могу выполнить задачу с идентификатором?

+0

Я думаю, что вы можете использовать обходной путь с Отозвать задачи по ID и отправить его обратно к брокеру с наивысшим приоритетом (но AFAIK это доступно только для [RabbitMQ] (https://github.com/celery/celery/issues/2635 # issuecomment-173597053)) –

+0

Если я отменяю задачу, могу ли я передать параметры этой задаче? так что я могу выполнить эту задачу на уровне приложения. – PythonEnthusiast

+0

Я думал, что вы можете получить AsyncResult от task_id и получить от него аргументы, а затем отменить эту задачу и создать новую. –

ответ

0

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

короткий ответ вы не можете. Работники сельдерей вытаскивают задания с бэкэнда брокера по мере их появления.

Почему бы и нет?

Обратите внимание, что это не является ограничением Сельдерея как такового, а скорее является характеристикой систем очередей сообщений (MQS) в целом. Точка MQS заключается в десинхронировании компонента приложения, чтобы продюсер мог продолжить работу, в то время как рабочие выполняли задачи асинхронно. Другими словами, как только задача была отправлена, ее нельзя изменить (но ее можно удалить, если она еще не запущена).

Какие существуют варианты?

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

  1. Routing - задачи могут быть направлены на различные рабочие. Поэтому, если ваши задачи [0 .. 9] являются длительными, за исключением задачи 8, вы можете перенаправить задачу 8 к рабочему или к набору работников, которые занимаются краткосрочными задачами.

  2. Timed execution - указать обратный отсчет или расчетное время прибытия (эта) для каждой задачи. Это хороший вариант, если вы знаете, что некоторые задачи могут быть отложены для последующего выполнения, т. Е. Когда система будет менее занята. Это позволяет работникам готовиться к тем задачам, которые необходимо выполнить немедленно.

  3. Task expiry - указать время обратного отсчета или время с обратным вызовом. Таким образом, задача будет отменена, если она не будет выполняться в течение времени, выделенного ей, и обратный вызов может начать альтернативный курс действий.

  4. Check on task results periodically, аннулировать задачу, если она не начала выполнение в течение некоторого времени. Обратите внимание, что это отличается от истечения срока действия задачи, когда отзыв отменяется только после того, как рабочий вытащил задачу из очереди - если очередь заполнена, отмена может произойти слишком поздно для вашего прецедента.Проверка результатов периодически означает, что у вас есть другой компонент в вашей системе, который делает это и определяет альтернативный курс действий.

+0

Если я отменяю задачу, могу ли я передать параметры этой задаче? так что я могу выполнить эту задачу на уровне приложения. – PythonEnthusiast

+0

Возможно, вы сможете сделать это, используя сигнал ['task_revoked'] (http://docs.celeryproject.org/en/latest/userguide/signals.html#task-revoked) или [' task_revoked'] (http://docs.celeryproject.org/en/latest/userguide/monitoring.html#task-revoked). Специфика действительно зависит от того, чего вы хотите достичь. – miraculixx

+0

Есть ли способ получить параметры, переданные заданию, с учетом task_id? – PythonEnthusiast

Смежные вопросы