Сельдерей: группа подзадач не выполняется, если время родительского задания истекло - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть родительская задача, из которой я выполняю подзадачи через группу:

@task()
def parent():    
  ...
  for x in big_long_loop:
    subtasks = []
    ...
    subtasks.append(subtask.s(foo, bar, baz))
    ...
    g = group(*subtasks)
    g.delay()

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

Время от времени, в разгар запуска групп подзадач, эта родительская задача не выполняется или время ожидания истекло.После этого момента (удаленный) рабочий для очереди подзадач становится бесполезным.Он колеблется онлайн / офлайн в цветке, и в конечном итоге просто перестает выполнять задачи.Они получены, но никогда не запускаются удаленным работником.

Это ожидаемое поведение?Если родитель в конечном итоге не преуспевает, как это повлияет на любые подзадачи, которые были созданы во время этой задачи или в будущем, когда задача будет выполнена снова?Это как-то связано с тем, что работник haywire находится на удаленном сервере?Обратите внимание, что на этом сервере есть другие рабочие для других очередей, и они не мерцают в автономном режиме.

1 Ответ

0 голосов
/ 25 сентября 2018

После большой боли мы обнаружили здесь проблему: мы передавали объекты модели django в подзадачи.Это создало некоторое замедление, так как я предполагаю, что соединение db с родительской машины сохранялось и передавалось на удаленную машину, вызывая замедление DB и rabbitmq, поскольку объекты попадали в DB через соединение db «через родительскую машину».

Все стало очень гладко, когда мы изменили с subtask.s(foo, bar, baz) на subtask.s(foo.id, bar.id, baz.id)

...