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.
- 1. pas lu le blocage sur le tube nommé
- 2. Impossible de lire le tube nommé en Java
- 3. Java Socket OutputStream ne purge pas
- 4. Comment lire/écrire depuis erlang vers un tube nommé?
- 5. /bin/sh: comment rediriger de & 3 vers un tube nommé?
- 6. Comment ouvrir un tube nommé à partir de VBScript?
- 7. L'index HTMLAgilityPack ChildNodes fonctionne, le noeud nommé ne fonctionne pas
- 8. ImportError: Aucun module nommé ***** en python
- 9. OpenGL nommé textures ne fonctionne pas
- 10. Comment faire une écriture non-en attente sur un tube nommé (C#)?
- 11. Comment envoyer des messages entre C++ .dll et l'application C# en utilisant un tube nommé?
- 12. Python: Aucun module nommé core.exceptions
- 13. Est-il possible de mélanger un tube nommé avec select en perl?
- 14. purge toutes les dépendances
- 15. Stdout capturé à partir du tube en Python est tronqué
- 16. Pas de module nommé django.core
- 17. Comment vider un tube en utilisant bash
- 18. Pourquoi mon tube Perl vers zcat ne meurt-il pas si le fichier n'est pas là?
- 19. purge précédent css
- 20. Comment effectuer une fopen non bloquante sur un tube nommé (mkfifo)?
- 21. Importation d'un module python .net - « Aucun module le signal nommé »
- 22. Comment créer un fichier temporaire nommé sur Windows en Python?
- 23. Python Wildcard Importer Vs Importé Nommé
- 24. Est-il possible d'ouvrir un tube nommé avec une ligne de commande dans Windows?
- 25. pas capable d'écrire sur le tube cpp de Windows visuelle
- 26. En utilisant python graphviz ImportError: Aucun module nommé _gv
- 27. ImportError: Pas de module nommé Foundation
- 28. Tableau Javascript nommé statut ne fonctionnant pas dans google chrome
- 29. fenêtres: est-il possible de vidage (direct) un fichier texte dans un tube nommé
- 30. Python 2.5.4 - ImportError: aucun module nommé etree.ElementTree
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