Что-то очень странное происходит, когда я открываю FIFO (именованные каналы) в Python для записи. Подумайте, что происходит, когда я пытаюсь открыть FIFO для записи в интерактивном интерпретаторе:
>>> fifo_write = open('fifo', 'w')
Вышеупомянутая строка блокируется, пока я не открою другой интерпретатор и не наберу следующее:
>>> fifo_read = open('fifo', 'r')
>>> fifo.read()
Я не понимаю, почему мне пришлось ждать конвейера будет открыт для чтения, но давайте пропустим это. Приведенный выше код будет блокироваться до тех пор, пока не появятся ожидаемые данные. Однако, допустим, я возвращаюсь к первому окну интерпретатора и набираю:
>>> fifo_write.write("some testing data\n")
>>> fifo_write.flush()
Ожидаемое поведение состоит в том, что во втором интерпретаторе будет возвращен вызов read
, и мы увидим данные на экране, за исключением того, что со мной не происходит. Если я позвоню os.fsync
, произойдет следующее:
>>> 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
И считыватель fifo все еще ждет. Однако, если я вызываю fifo_writer.close ()
, данные удаляются. Если я использую команду оболочки для подачи канала:
$ echo "some data" > fifo
, то вывод читателя будет:
>>> fifo_read.read()
'some data\n'
Кто-нибудь испытал это? Если да, то есть ли обходной путь? Моя текущая ОС - Ubuntu 11.04 с Linux 2.6.38.