Python прочитал имя PIPE

У меня есть именованный канал в linux, и я хочу прочитать его с python. Проблема в том, что процесс python «потребляет» одно ядро ​​(100%) непрерывно. Мой код следующий:

FIFO = '/var/run/mypipe' os.mkfifo(FIFO) with open(FIFO) as fifo: while True: line = fifo.read() 

Я хочу спросить, поможет ли «спать» ситуация или процесс потерять некоторые входные данные из трубы. Я не могу управлять входом, поэтому я не знаю частоты ввода данных. Я читал о выборе и опросе, но я не нашел примера для моей проблемы. Наконец, я хочу спросить, влияет ли 100% -ное использование на ввод данных (потеря или что-то?).

edit: Я не хочу прерывать цикл. Я хочу, чтобы процесс выполнялся непрерывно и «слышит» данные из трубы.

One Solution collect form web for “Python прочитал имя PIPE”

В типичном режиме UNIX read(2) возвращает 0 байт, чтобы указать конец файла, который может означать:

  • В файле больше нет байтов
  • Другой конец сокета отключил соединение
  • Писатель закрыл трубку

В вашем случае fifo.read() возвращает пустую строку, потому что автор закрыл свой файловый дескриптор.

Вы должны обнаружить этот случай и выйти из цикла:

reader.py :

 import os import errno FIFO = 'mypipe' try: os.mkfifo(FIFO) except OSError as oe: if oe.errno != errno.EEXIST: raise print("Opening FIFO...") with open(FIFO) as fifo: print("FIFO opened") while True: data = fifo.read() if len(data) == 0: print("Writer closed") break print('Read: "{0}"'.format(data)) 

Пример сеанса

Терминал 1 :

 $ python reader.py Opening FIFO... <blocks> 

Терминал 2 :

 $ echo -n 'hello' > mypipe 

Терминал 1 :

 FIFO opened Read: "hello" Writer closed $ 

Обновление 1 – Непрерывное повторное открытие

Вы указываете, что хотите продолжать слушать записи на трубе, возможно, даже после закрытия писателя.

Чтобы сделать это эффективно, вы можете (и должны) воспользоваться тем, что

Обычно открываются блоки FIFO, пока не открывается другой конец.

Здесь я добавляю еще один цикл вокруг open и цикла read . Таким образом, как только труба будет закрыта, код попытается повторно открыть ее, которая будет блокироваться, пока другой писатель не откроет трубу:

 import os import errno FIFO = 'mypipe' try: os.mkfifo(FIFO) except OSError as oe: if oe.errno != errno.EEXIST: raise while True: print("Opening FIFO...") with open(FIFO) as fifo: print("FIFO opened") while True: data = fifo.read() if len(data) == 0: print("Writer closed") break print('Read: "{0}"'.format(data)) 

Терминал 1 :

 $ python reader.py Opening FIFO... <blocks> 

Терминал 2 :

 $ echo -n 'hello' > mypipe 

Терминал 1 :

 FIFO opened Read: "hello" Writer closed Opening FIFO... <blocks> 

Терминал 2 :

 $ echo -n 'hello' > mypipe 

Терминал 1 :

 FIFO opened Read: "hello" Writer closed Opening FIFO... <blocks> 

… и так далее.


Вы можете узнать больше, прочитав man страницу для труб:

  • PIPE (7) – Руководство для программиста на Linux
  • FIFO (7) – Руководство для программиста на Linux
Python - лучший язык программирования в мире.