Обработка потока данных в python

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

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

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

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

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

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

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

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

Изменить: Другие найденные библиотеки:

Ответы

Ответ 2

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

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

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