2011-03-28 7 views
15

J'ai n (typiquement n < 10 mais il devrait s'agrandir) des processus s'exécutant sur des machines différentes et communiquant via amqp en utilisant RabbitMQ. Les processus sont généralement longs et peuvent être implémentés dans n'importe quelle langue (bien que la plupart soient java/python).Calcul de flux de données en python

Chaque processus nécessite un nombre d'entrées (nombres/chaînes) et produit un certain nombre de sorties (également des nombres ou des chaînes). L'exécution d'un processus s'effectue de manière asynchrone: envoi d'un message dans sa file d'attente d'entrée et attente du déclenchement d'un rappel par la file d'attente de sortie.

Idéalement, l'utilisateur spécifie des entrées et des sorties désirées et le système devrait:

  • détecter les processus nécessaires et générer le graphe de dépendance
  • tri topologiquement le graphique et l'exécuter, les transitions de noeuds devront être déclenché par un événement

Un nœud devrait se déclencher si son entrée est prête, permettant le parallélisme par branche. Je ne peux supposer aucun cycle pour l'instant, mais il y aura finalement des cycles (par exemple, deux processus peuvent devoir itérer jusqu'à ce que la sortie ne change plus).

Cela devrait être un problème connu de programmation de flux de données (discussed here before) et je veux éviter de réinventer la roue. Je préférerais une solution python et une recherche mène à Trellis et Pypes. Le treillis n'est plus développé mais semble soutenir les cycles, contrairement aux pypes. Vous ne savez pas non plus comment les pypes sont activement développés. Autres recherches reveal a whole list of event based programming frameworks, dont je connais particulièrement bien. Il y a bien sûr des environnements de workflow comme Taverna et KNIME, mais cela semble exagéré.

Quelqu'un a-t-il une expérience de ce type de problème ou des bibliothèques mentionnées?

Modifier: Autres bibliothèques je trouve sont:

+0

Qu'est-ce que vous avez sélectionné à la fin? – elviejo79

+1

J'ai fini par rouler ma propre couche mince sur le dessus de Rabbitmq – dgorissen

+0

ouais ... peut-être dans un proche avenir Dataflow/beam sera une bonne solution pour python. http://stackoverflow.com/questions/35264441/what-is-apache-beam – elviejo79

Répondre

1

La ligne de fond est que si vous pouvez réinventer la roue dans un petit nombre de lignes de code (quelques centaines) que vous compl comprendre et pouvoir documenter, puis le faire.

Il s'agit d'un domaine où les abstractions utilisées ne sont pas si difficiles à mettre en œuvre avec certains outils de base. RabbitMQ est un tel outil. Node.js en est un autre. Il y a beaucoup de bibliothèques qui implémentent des méthodes utiles pour gérer les flux de données, les workflows, les machines à états finis, etc., mais elles ont beaucoup de chevauchement et elles ont tendance à être incomplètes. Il est probable que le développeur d'origine ait juste construit assez pour surmonter son problème initial, et comme ce type de programmation n'était pas très populaire, il n'y avait pas la masse critique nécessaire pour poursuivre le développement. Il y a beaucoup à dire pour classer toutes les solutions possibles par popularité, en choisissant la plus populaire, et en mettant tout en œuvre pour la faire fonctionner (tout en partageant votre travail, bien sûr).