Вычислительный поток данных в Python
У меня есть n (обычно n < 10, но оно должно масштабироваться) процессов, запущенных на разных машинах и взаимодействующих через amqp с использованием RabbitMQ. Процессы обычно долго выполняются и могут быть реализованы на любом языке (хотя большинство из них - Java/ Python).
Каждый процесс требует нескольких входов (чисел / строк) и производит несколько выходов (также только числа или строки). Выполнение процесса происходит асинхронно: отправка сообщения в его входную очередь и ожидание обратного вызова, инициируемого выходной очередью.
В идеале пользователь указывает некоторые входные данные и желаемые выходные данные, и система должна:
- определить, какие процессы необходимы, и сгенерировать график зависимости
- топологически отсортируйте график и выполните его, переходы узлов должны быть управляемыми событиями
Узел должен запускаться, если его вход готов, позволяя параллелизм для каждой ветви. Я могу предположить, что пока нет циклов, но в конечном итоге будут циклы (например, двум процессам может потребоваться повторение, пока вывод больше не изменится).
Это должно быть известной проблемой из (потока данных) программирования ( обсуждаемого здесь ранее), и я хочу избежать повторного изобретения колеса. Я бы предпочел решение на python, а поиск ведет к Trellis и Pypes. Треллис больше не развивается, но, кажется, поддерживает циклы, а Пайпс - нет. Также не уверен, насколько активно развиваются pypes.
Дальнейшие поиски показывают полный список основанных на событиях сред программирования, ни о одной из которых я не особенно осведомлен. Конечно, существуют рабочие среды, такие как Taverna и KNIME, но это кажется излишним.
У кого-нибудь есть опыт решения подобных проблем или с упомянутыми библиотеками?
Изменить: Другие библиотеки, которые я нашел:
2 ответа
У python.org есть вики-страница "Потоковое программирование" - http://wiki.python.org/moin/FlowBasedProgramming
Суть в том, что если вы можете заново изобрести колесо в небольшом количестве строк кода (несколько сотен), которые вы полностью понимаете и можете задокументировать, то сделайте это.
Это та область, в которой используемые абстракции не так сложны для реализации, учитывая некоторые базовые базовые инструменты. RabbitMQ - такой инструмент. Node.js - это другое. Вокруг существует множество библиотек, которые реализуют полезные способы управления потоками данных, рабочими процессами, конечными автоматами и т. Д., Но они во многом совпадают и, как правило, являются неполными. Вероятно, первоначальный разработчик просто создал достаточно, чтобы справиться со своей первоначальной проблемой, и, поскольку этот тип программирования не был настолько популярен, не было критической массы, чтобы продолжать развитие.
Многое можно сказать о ранжировании всех возможных решений по популярности, выборе наиболее популярного и прилагании усилий к тому, чтобы оно сработало (конечно же, при совместном использовании вашей работы).