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.

Comment avez-vous créer de la fifo?
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