Следующее должно просто работать.
import sys
for line in sys.stdin:
# whatever
Обоснование:
Код будет перебирать строки в stdin по мере их поступления. Если поток все еще открыт, но нетЕсли строка завершена, цикл будет зависать до тех пор, пока либо не встретится символ новой строки (и не будет возвращена вся строка), либо поток не будет закрыт (и все, что осталось в буфере, будет возвращено).
Как только потокбыл закрыт, больше данных не может быть записано или считано из стандартного ввода.Период.
Причина, по которой ваш код перегружал ваш процессор, заключается в том, что после закрытия стандартного ввода все последующие попытки перебрать стандартный вывод будут немедленно возвращаться без каких-либо действий.По сути, ваш код был эквивалентен следующему.
for line in sys.stdin:
# do something
while 1:
pass # infinite loop, very CPU intensive
Может быть, было бы полезно, если бы вы опубликовали, как вы пишете данные в стандартный ввод.
РЕДАКТИРОВАТЬ:
Python (для целей циклов, итераторов и readlines () будет считать поток закрытым, когда он встречает символ EOF. Вы можете попросить python прочитать больше данных после этого, но вы не можете использовать ни один из предыдущихметоды. Страница man python рекомендует использовать
import sys
while True:
line = sys.stdin.readline()
# do something with line
При обнаружении символа EOF readline вернет пустую строку. Следующий вызов readline будет функционировать как обычно, если поток все еще открыт. Вы можете проверить этосамостоятельно, запустив команду в терминале. Нажатие Ctrl + D приведет к тому, что терминал запишет символ EOF в stdin. Это приведет к завершению первой программы в этом посте, но последняя программа продолжит читать данные до тех пор, пока потокна самом деле закрыт. Последняя программа не должна 100% ваш процессор, так как readline будет ждать, пока естьчтобы вернуть, а не возвращать пустую строку.
У меня проблема с занятым циклом, только когда я пытаюсь прочитать строку из реального файла.Но при чтении со стандартного ввода readline счастливо блокирует.