2015-04-13 3 views
5

В приложении, над которым я работаю, пользователь может выполнить «переход», который состоит из «шагов». Шаг может иметь произвольное количество зависимостей от других шагов. Я хотел бы иметь возможность вызвать переход и выполнять шаги параллельно как отдельные задачи Сельдерея.Сельдерей - запуск набора задач со сложными зависимостями

В идеале мне бы хотелось что-то вроде строк celery-tasktree, за исключением ориентированных ациклических графов в целом, а не только деревьев, но пока не существует такой библиотеки.

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

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

Как указано в https://cs.stackexchange.com/questions/2524/getting-parallel-items-in-dependency-resolution, лучший способ работает непосредственно от DAG - после каждого завершение задачи, проверить, могут ли какие-либо из ее зависимых задач работать, и если да, запустите их.

Что было бы лучшим способом реализовать что-то подобное? Мне непонятно, что есть простой способ сделать это.

Из того, что я могу сказать, примитивы группы сельдерея/цепи/аккорда не являются достаточно гибкими, чтобы я мог выразить полную DAG - хотя, возможно, я ошибаюсь здесь?

Я думаю, что могу создать оболочку для задач, которые уведомляют зависимые задачи после завершения текущей задачи. Я не уверен, что лучший способ обработать такое уведомление будет. Доступ к базе данных Django приложения не является особенно опрятным, и это затруднит его использование в общей библиотеке, но сам сельдерей не предоставляет очевидных механизмов для этого.

+0

У меня такой же вопрос. Вы нашли что-нибудь? – neoascetic

+1

Имейте тот же вопрос. Моя лучшая мысль заключалась в том, чтобы ... не использовать сельдерей: -/Но это оставляет мне возможность писать много инфраструктуры. – matthewatabet

+1

Я открыл здесь проблему github: https://github.com/celery/celery/issues/3666 – matthewatabet

ответ

1

Я также столкнулся с этой проблемой, но я не мог найти лучшего решения или библиотеки, кроме одной библиотеки. Для всех, кого это интересует, вы можете проверить номер https://github.com/selinon/selinon. Хотя это только для python 3, похоже, это единственное, что делает именно то, что вы хотите.

Воздушный поток - еще один вариант, но воздушный поток используется в более статической среде, как и другие библиотеки dag.

+0

О, это выглядит * удивительно *. Если бы я все еще работал в компании, на которой я работал, когда задавал этот вопрос :) – ajd