В приложении, над которым я работаю, пользователь может выполнить «переход», который состоит из «шагов». Шаг может иметь произвольное количество зависимостей от других шагов. Я хотел бы иметь возможность вызвать переход и выполнять шаги параллельно как отдельные задачи Сельдерея.Сельдерей - запуск набора задач со сложными зависимостями
В идеале мне бы хотелось что-то вроде строк celery-tasktree, за исключением ориентированных ациклических графов в целом, а не только деревьев, но пока не существует такой библиотеки.
Первое решение, которое приходит на ум, - это параллельная адаптация стандартного топологического сорта - вместо определения линейного порядка шагов, которые удовлетворяют соотношению зависимостей, мы определяем весь набор шагов, которые могут выполняться параллельно на начало, за которым следует весь набор шагов, которые могут быть выполнены в раунде 2 и т. д.
Однако это не оптимально, когда задачи занимают переменное время, и работники вынуждены простаивать, ожидая выполнения более длительной работы, пока есть задачи, которые теперь готовы к запуску. (Для моего конкретного приложения это решение, вероятно, прекрасное, но я все равно хотел бы выяснить, как оптимизировать это.)
Как указано в https://cs.stackexchange.com/questions/2524/getting-parallel-items-in-dependency-resolution, лучший способ работает непосредственно от DAG - после каждого завершение задачи, проверить, могут ли какие-либо из ее зависимых задач работать, и если да, запустите их.
Что было бы лучшим способом реализовать что-то подобное? Мне непонятно, что есть простой способ сделать это.
Из того, что я могу сказать, примитивы группы сельдерея/цепи/аккорда не являются достаточно гибкими, чтобы я мог выразить полную DAG - хотя, возможно, я ошибаюсь здесь?
Я думаю, что могу создать оболочку для задач, которые уведомляют зависимые задачи после завершения текущей задачи. Я не уверен, что лучший способ обработать такое уведомление будет. Доступ к базе данных Django приложения не является особенно опрятным, и это затруднит его использование в общей библиотеке, но сам сельдерей не предоставляет очевидных механизмов для этого.
У меня такой же вопрос. Вы нашли что-нибудь? – neoascetic
Имейте тот же вопрос. Моя лучшая мысль заключалась в том, чтобы ... не использовать сельдерей: -/Но это оставляет мне возможность писать много инфраструктуры. – matthewatabet
Я открыл здесь проблему github: https://github.com/celery/celery/issues/3666 – matthewatabet