2016-08-18 2 views
1

Я не эксперт Python, однако я пытаюсь разработать некоторые долговременные задачи, основанные на сельдерея, которые я могу получить доступ к их частичным результатам, а не ждать выполнения задач Конец.Доступ к частичным результатам задачи Celery

Как вы можете видеть в коде ниже, учитывая множитель, начальный и конечный диапазон, работник создает список размеров final_range - initial_range + 1.

from celery import Celery 
app = Celery('trackers', backend='amqp', broker='amqp://') 

@app.task 
def worker(value, initial_range, final_range): 
    if initial_range < final_range 
     list_values = [] 
     for index in range(initial_frame, final_frame + 1): 
      list_values.append(value * index) 
     return list_values 
    else 
     return None 

Таким образом, вместо того, чтобы ждать всех четыре рабочих закончить, я хотел бы получить доступ к чтобы быть возвращаемые значения (list_values ​​), прежде чем они на самом деле вернулся.

from trackers import worker 

res_1 = worker.delay(3, 10, 10000000) 
res_2 = worker.delay(5, 01, 20000000) 
res_3 = worker.delay(7, 20, 50000000) 
res_4 = worker.delay(9, 55, 99999999) 

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

+0

Вы хотите получить доступ к res_1, не дожидаясь res_4, или вы хотите получить доступ к списку_значений до окончания работы? –

+0

Я хочу получить доступ к списку_значений до окончания заданий –

+1

Тогда вам понадобится источник правды, из которого вы можете сбросить значения и прочитать их. Если вы работаете на одной машине, это может быть так же просто, как создание глобальных структур данных, к которым могут обращаться как рабочие, так и родительский процесс (хотя это, как правило, не очень хорошая идея - получение многопоточного доступа к глобальным правым является очень сложным). Лучшим решением является использование внешнего источника правды, такого как база данных. Я использовал redis для таких вещей: рабочие добавляют значения в структуру данных, родительский читает их, а redis обрабатывает проблемы с потоками и доступом. –

ответ

0

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

Итак, в вашем примере вы должны хранить list_values ​​в некоторых БД и обновлять его во время цикла.

+0

Я узнал, что Redis - это своего рода БД основной памяти (нет необходимости обращаться к диску). Поэтому я предпочел бы использовать Redis, я просто не знаю, как получить доступ к частичным результатам за пределами рабочих. –

+0

Redis - хороший выбор для этой задачи. И каждый работник - это отдельный процесс ОС, поэтому никто не может прочитать его память. Для межпроцессного взаимодействия в Linux могут использоваться именованные каналы, разделяемая память (например, с использованием tmpfs) и сокеты, и все эти методы уступают место Redis в вашем случае, поскольку он прост в использовании и легко масштабируется. – g1zmo

0

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

Если вам нужны первые значения для вычисления значений позже в списке, то вы можете связать задачи с помощью параметра link. См. http://docs.celeryproject.org/en/latest/userguide/canvas.html#callbacks

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