10
votes

Résultats du ruisseau dans le céleri

J'essaie d'utiliser le céleri pour planifier et exécuter des tâches sur une flotte de serveurs. Chaque tâche est quelque peu longue (quelques heures) et implique d'utiliser des sous-processus pour appeler un programme donné avec les intrants donnés. Ce programme produit beaucoup de production à la fois dans STDOUT et STDERR.

Y a-t-il un moyen de montrer la sortie produite par le programme au client dans une heure presque réelle? Streamez la sortie, de sorte que le client puisse regarder la sortie sensibilisée par la tâche exécutée sur le serveur sans vous connecter au serveur?


2 commentaires

Quelle est votre tâche de céleri pendant que l'autre programme fonctionne? Utilisez-vous simplement sous-processus.Call ?


Yup juste un sous-processus.Call.


3 Réponses :


6
votes

La manière dont je vois comment faire est d'écrire un enregistreur personnalisé qui sera utilisé pour stardr et stdout (voir le docs : xxx

Votre enregistreur peut enregistrer les données dans la base de données, memcached, redis ou quel que soit le stockage partagé que vous Utilisez pour obtenir les données.

Je ne suis pas sûr de la structure du Logger , mais je suppose que quelque chose comme ça fonctionnera: xxx


2 commentaires

@anand_trex Avez-vous essayé cela?


Je ne suis pas très confortable mélange de journalisation et de streaming de résultat. Comme c'est une sorte de hack, je ne vais pas utiliser cette solution.



13
votes

Vous n'avez pas spécifié de nombreuses exigences et contraintes. Je vais supposer que vous avez déjà une instance Redis quelque part.

Ce que vous pouvez faire est de lire la sortie de l'autre ligne de processus par ligne et de le publier via REDIS: P>

Voici un exemple où vous Peut écho code> dans un fichier / tmp / foo code> pour tester: p> xxx pré>

dans un processus séparé: p > xxx pré>

Si vous voulez que le processus se termine, vous pouvez par exemple Envoyer un "Quit" après que la tâche de céleri est terminée. p>

Vous pouvez utiliser différents canaux (la chaîne dans S'abonner code>) pour séparer la sortie de différents processus. P> Vous pouvez également stocker votre sortie de journal dans Redis, si vous le souhaitez, P>

redis_instance.rpush('process log', message)


0 commentaires

4
votes

C'est une ancienne question, mais il est toujours à peu près le seul résultat de ce sujet spécifique.

Voici comment je suis allé à ce sujet, J'ai créé un simple objet semblable à un fichier qui publie sur un canal spécifique sur REDIS P>

def capture_output(self):
    sys.stdout = RedisFileObject(self.request.id)
    sys.stderr = RedisFileObject(self.request.id)


0 commentaires