2010-01-26 14 views
4

J'ai un tube nommé créé via la commande os.mkfifo(). J'ai deux processus Python différents accédant à ce tube nommé, le processus A est en train de lire, et le processus B est en train d'écrire. Le processus A utilise la fonction select pour déterminer quand des données sont disponibles dans fifo/pipe. Malgré le fait que le processus B se vide après chaque appel d'écriture, la fonction select du processus A ne retourne pas toujours (il continue à bloquer comme s'il n'y avait pas de nouvelles données). Après avoir longuement étudié ce problème, j'ai finalement programmé le processus B pour ajouter 5Ko d'ordures avant et après mon appel réel, et de même le processus A est programmé pour ignorer ces 5KB. Maintenant tout fonctionne bien, et select revient toujours de manière appropriée. Je suis arrivé à cette solution hack-ish en notant que le processus A retournerait si le processus B devait être détruit (après avoir écrit et purgé, il dormirait sur un tuyau de lecture). Y at-il un problème avec flush dans Python pour les tuyaux nommés?Le tube nommé ne purge pas en Python

+0

pouvez-vous publier un code de test minimal qui montrent le problème. Comme vous décrivez le problème d'une douzaine de lignes devrait être suffisant. – kriss

Répondre

0

L'opération de vidage n'est pas pertinente pour les tuyaux nommés; les données pour les canaux nommés sont strictement conservées en mémoire et ne seront pas libérées tant qu'elles n'auront pas été lues ou que le FIFO ne sera pas fermé.

+3

L'opération de vidage peut toujours être pertinente si la sortie de données dans le tube est mise en mémoire tampon au niveau de l'application. –

+0

Je suppose qu'il y a un tampon au niveau de l'application, est-ce que quelqu'un connaît un bug? – BrainCore

1

Quelles API utilisez-vous? os.read() et os.write() ne mettent rien en mémoire tampon.

1

Pour savoir si la mise en mémoire tampon interne de Python cause vos problèmes, lors de l'exécution de vos scripts, faites "python -u" au lieu de "python". Cela forcera python à "unbuffered mode", ce qui entraînera l'impression instantanée de toutes les sorties.