2011-03-28 11 views
15

Tengo n (normalmente n < 10 pero debe escalar) procesos que se ejecutan en diferentes máquinas y se comunican a través de amqp usando RabbitMQ. Los procesos suelen ser de larga ejecución y pueden implementarse en cualquier idioma (aunque la mayoría son java/python).Computación de flujo de datos en python

Cada proceso requiere un número de entradas (números/cadenas) y produce varias salidas (también solo números o cadenas). La ejecución de un proceso ocurre de forma asíncrona: envía un mensaje en su cola de entrada y espera que la cola de salida active una devolución de llamada.

Idealmente, el usuario especifica algunas entradas y salidas deseadas y el sistema debería:

  • detectar qué procesos se necesitan y generar el gráfico dependencia
  • topológicamente ordenar el gráfico y ejecutarlo, transiciones de nodo necesitarán ser controlado por eventos

Un nodo debe activarse si su entrada está lista, lo que permite el paralelismo por rama. Puedo suponer que no hay ciclos por el momento, pero eventualmente habrá ciclos (por ejemplo, dos procesos pueden necesitar iterar hasta que la salida ya no cambie).

Esto debería ser un problema conocido de la programación de flujo (de datos) (discussed here before) y quiero evitar reinventar la rueda. Preferiría una solución de Python y una búsqueda lleva a Trellis y Pypes. Trellis ya no está desarrollado pero parece soportar ciclos, mientras que los pype no. Además, no estoy seguro de qué tan activamente se está desarrollando pypes.

Otras búsquedas reveal a whole list of event based programming frameworks, ninguna de las cuales conozco particularmente. Por supuesto, hay entornos de flujo de trabajo como Taverna y KNIME, pero eso parece excesivo.

¿Alguien tiene alguna experiencia abordando este tipo de problema o con las bibliotecas mencionadas?

Editar: Otras bibliotecas que he encontrado son:

+0

¿Qué selecciona al final? – elviejo79

+1

Acabo de rodar mi propia capa delgada sobre rabbitmq – dgorissen

+0

sí ... tal vez en el futuro cercano Dataflow/beam será una buena solución para python. http://stackoverflow.com/questions/35264441/what-is-apache-beam – elviejo79

Respuesta

1

La conclusión es que si se puede reinventar la rueda en una pequeña cantidad de líneas de código (unos cientos) que compl Comprenda y pueda documentar, luego hágalo.

Esta es un área donde las abstracciones utilizadas no son tan difíciles de implementar dado algunas herramientas de base básicas. RabbitMQ es una herramienta de este tipo. Node.js es otro. Hay muchas bibliotecas alrededor que implementan formas útiles para administrar flujos de datos, flujos de trabajo, máquinas de estados finitos, etc., pero tienen mucha superposición y tienden a ser incompletas. Probablemente el desarrollador original acaba de construir lo suficiente para superar su problema inicial, y dado que este tipo de programación no era tan popular, no había una masa crítica para mantener el desarrollo en marcha.

Hay mucho que decir acerca de clasificar todas las soluciones posibles por popularidad, eligiendo la más popular y esforzándose para que funcione (mientras se comparte su trabajo, por supuesto).

Cuestiones relacionadas