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
Répondre
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é.
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. –
Je suppose qu'il y a un tampon au niveau de l'application, est-ce que quelqu'un connaît un bug? – BrainCore
Quelles API utilisez-vous? os.read()
et os.write()
ne mettent rien en mémoire tampon.
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.
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