2008-12-14 6 views
13

J'ai des problèmes avec le module multitraitement Python. J'utilise la classe Process pour engendrer un nouveau processus afin d'utiliser mon deuxième noyau. Ce second processus charge un tas de données dans la RAM et attend patiemment au lieu de consommer.Aucune sortie d'impression issue du multitraitement enfant.Processus sauf si le programme se bloque

Je voulais voir ce que ce processus imprimé avec la commande print, cependant, je ne vois rien qui imprime. Je vois seulement ce que le processus parent imprime. Maintenant, cela a du sens pour moi, car ils vivent dans deux processus différents. Le deuxième processus ne génère pas sa propre fenêtre de sortie shell/standard, et sa sortie n'est pas non plus envoyée au parent. Pourtant, lorsque ce processus plante, il imprime tout ce que mon script lui a demandé d'imprimer, plus la trace et l'erreur de la pile.

Je me demande s'il existe un moyen simple d'envoyer la sortie d'impression du processus fils au premier processus, ou de faire apparaître une sortie shell/standard pour que je puisse le déboguer. Je sais que je pourrais créer un multiprocessing.Queue dédié à la transmission des impressions au parent afin qu'il puisse les imprimer en sortie standard, mais je n'ai pas envie de le faire si une solution plus simple existe.

Répondre

23

Avez-vous essayé le rinçage stdout?

import sys 
print "foo" 
sys.stdout.flush() 
+0

génial! Oui ça a vraiment marché. Que fait ce sys.stdout.flush()? Force-t-il explicitement les impressions à stdout? Merci encore! –

+1

Il efface les tampons. Stdout est sauvegardé jusqu'à ce que vous ayez un tampon complet. Flush s'arrête en attente. Essayez d'imprimer sur stderr pour voir ce qu'il fait. Parfois, il n'est pas tamponné. –

+0

@Nicholas: pas de problème :) Lors de l'exécution de sous-processus, leur sortie standard est généralement mise en mémoire tampon (et leur erreur standard ne l'est généralement pas), S.Lott explique ce que cela signifie. Vous pouvez essayer différentes astuces pour empêcher la mise en mémoire tampon, mais ne pas oublier d'utiliser sys.stdout.flush() est simple et fonctionne toujours. – orip

Questions connexes