Именованная труба не очищается в Python - PullRequest
4 голосов
/ 26 января 2010

У меня есть именованный канал, созданный с помощью команды os.mkfifo (). У меня есть два разных процесса Python, обращающихся к этому именованному каналу, процесс A читает, а процесс B пишет. Процесс A использует функцию выбора, чтобы определить, когда есть данные, доступные в fifo / pipe. Несмотря на то, что процесс B сбрасывается после каждого вызова записи, функция выбора процесса A не всегда возвращается (она продолжает блокироваться, как будто нет новых данных). После тщательного изучения этой проблемы я, наконец, просто запрограммировал процесс B для добавления 5 КБ записей мусора до и после моего реального вызова, а также процесс A запрограммирован на игнорирование этих 5 КБ. Теперь все работает нормально, а select всегда возвращается соответствующим образом. Я пришел к этому хакерскому решению, заметив, что select процесса A вернется, если процесс B будет уничтожен (после записи и сброса он будет спать в канале чтения). Есть ли проблема с сбросом в Python для именованных каналов?

Ответы [ 3 ]

1 голос
/ 04 февраля 2010

Какие API вы используете? os.read() и os.write() ничего не буферизировать.

1 голос
/ 24 марта 2010

Чтобы выяснить, вызывает ли ваша проблема внутренняя буферизация Python, при запуске ваших сценариев выполните "python -u" вместо "python". Это вынудит Python перейти в «небуферизованный режим», что приведет к немедленной печати всего вывода.

0 голосов
/ 26 января 2010

Операция очистки не имеет значения для именованных каналов;данные для именованных каналов хранятся строго в памяти и не будут выпущены, пока они не будут прочитаны или FIFO не будет закрыт.

...