2016-02-01 3 views
0

Я использую сельдерей для параллелизации некоторых длительных рабочих заданий. На самом деле мой chunking algo не может гарантировать такую ​​же работу для каждой подзадачи . Поэтому я заметил это неожиданное поведение, используя неуравновешенные задачи внутри группы.Выбор сельдерея - подзадачи внутри группы

пример задачи:

@app.task(name='step') 
def step(s): 
    print 'step received:', s 
    time.sleep(s) 
    return s 

В этом сценарии:

%time group(step.s(10), step.s(1), step.s(1), step.s(3)) 
CPU times: user 32.2 ms, sys: 33.6 ms, total: 65.8 ms 
Wall time: <b>13.6 s</b> 
Out[5]: [10, 1, 1, 3] 

Я думаю, что ни одна комбинация 1,1,3,10 не может превышать 10SEC (плюс небольшое время для выполнения задач) ,

Я заметил, что этот призыв:

  • шаг (10) -> Рабочий 1
  • шаг (1) -> рабочий 2
  • шаг (1) -> Рабочий 3

после этого, работники 2 и 3 заняты в течение короткого времени (всего 1 сек.), Поэтому они могут работать над последней задачей, но «шаг (3)» будет обрабатываться ТОЛЬКО после завершения «шага (10)» ,

Это звучит странно для меня. Любое предложение?

Спасибо GLA

+0

Похоже, что это связано с предпрок: http://docs.celeryproject.org/en/latest/userguide/optimizing.html#prefork-pool-prefetch-settings. Правильно ли это? – Glauco

+0

... ... ... использование ... -Ofair' ... отличие ...? – scytale

+0

Да, да. Теперь он работает так, как ожидалось. – Glauco

ответ

1

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

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