Comment puis-je écrire correctement pour les Fifo en Python?
Quelque chose de très étrange se passe quand j'ouvre Fifo (named pipes) en Python pour l'écriture. Examinons ce qui se passe lorsque j'essaie d'ouvrir une FIFO pour l'écriture dans un interactive interprète:
>>> fifo_write = open('fifo', 'w')
La ligne ci-dessus les blocs jusqu'à ce que j'ouvre un autre interprète et tapez la commande suivante:
>>> fifo_read = open('fifo', 'r')
>>> fifo.read()
Je ne comprends pas pourquoi j'ai dû attendre pour la pipe à être ouverts pour la lecture, mais permet de sauter. Le code ci-dessus va bloquer jusqu'à ce qu'il y a des données disponibles comme prévu. Cependant, disons-je revenir à la première fenêtre de l'interpréteur et le type:
>>> fifo_write.write("some testing data\n")
>>> fifo_write.flush()
Le comportement attendu est que le deuxième interprète l'appel à read
sera de retour et nous allons voir les données sur l'écran, sauf que n'est pas ce qui m'arrive. Si je l'appelle os.fsync
les cas suivants:
>>> import os
>>> fifo_write.flush()
>>> os.fsync(fifo_write.fileno())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
Et de la fifo lecteur est toujours en attente. Cependant, si je l'appelle fifo_writer.close()
les données sont ensuite vidées. Si j'utilise une commande shell pour nourrir le tuyau:
$ echo "some data" > fifo
alors le lecteur de sortie est:
>>> fifo_read.read()
'some data\n'
Quelqu'un a vécu cette situation? Si oui, est-il une solution pour ça? Mon OS est Ubuntu 11.04 avec Linux 2.6.38.
utiliser os.mkfifo('peps')" ou en shell "mkfifo fifo"
fsync()
sur une FIFO n'a pas de sens; aucune des données est stockée sur le disque (à l'exception de peut-être swap en très étrange situations).OriginalL'auteur Thiago de Arruda | 2011-08-13
Vous devez vous connecter pour publier un commentaire.
read()
n'a pas retourné jusqu'à ce qu'il atteigne les expressions du FOLKLORE.Vous pouvez essayer de préciser le nombre d'octets que vous souhaitez lire, comme
read(4)
. Cela va encore bloquer jusqu'à ce que suffisamment d'octets ont été écrits de façon à ce que le producteur doit écrire au moins ce nombre d'octets et ensuite appelerflush()
.l'argument qu'exactement?
OriginalL'auteur Marcelo Cantos
Pour éviter le rinçage, ouvrez le fichier sans mise en mémoire tampon:
Qui va enlever de haut niveau de mise en mémoire tampon. Les données vont à l'OS directement et, étant une fifo, ils ne sont jamais réellement écrit sur le disque, mais passée directement au lecteur par le truchement de la mémoire tampon fifo, de sorte que vous n'avez pas besoin de synchronisation.
De sûr, vous devriez avoir créé la fifo d'abord avec
os.mkfifo()
oumkfifo
à la coque, comme vous l'avez souligné dans un commentaire.OriginalL'auteur Mike