Вычислительный поток данных в Python - PullRequest
15 голосов
/ 28 марта 2011

У меня n (обычно n <10, но должно масштабироваться) процессов, работающих на разных машинах и взаимодействующих через amqp с использованием RabbitMQ. Процессы, как правило, долго выполняются и могут быть реализованы на любом языке (хотя большинство из них - Java / Python). </p>

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

В идеале пользователь указывает некоторые входы и желаемые выходы, и система должна:

  • определить, какие процессы необходимы, и сгенерировать график зависимости
  • топологически сортируйте график и выполняйте его, переходы узлов должны быть управляемыми событиями

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

Это должно быть известной проблемой из (потока данных) программирования ( обсуждалось здесь до ), и я хочу избежать повторного изобретения колеса. Я бы предпочел решение на python, и поиск приводит к Trellis и Pypes . Треллис больше не развивается, но, кажется, поддерживает циклы, а Пайпс - нет. Также не уверен, насколько активно развиваются pypes.

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

У кого-нибудь есть опыт решения проблемы такого типа или с упомянутыми библиотеками?

Редактировать: Другие библиотеки, которые я нашел:

Ответы [ 2 ]

5 голосов
/ 18 октября 2012

python.org имеет вики-страницу «Потоковое программирование» - http://wiki.python.org/moin/FlowBasedProgramming

1 голос
/ 26 апреля 2011

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

Это область, гдеиспользуемые абстракции не так сложны для реализации, учитывая некоторые базовые инструменты.RabbitMQ - такой инструмент.Node.js - это другое.Вокруг существует множество библиотек, которые реализуют полезные способы управления потоками данных, рабочими процессами, конечными автоматами и т. Д., Но они во многом совпадают и, как правило, являются неполными.Вероятно, первоначальный разработчик просто создал достаточно, чтобы справиться со своей первоначальной проблемой, и поскольку этот тип программирования не был настолько популярен, не было критической массы для продолжения разработки.

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

...