Именованный канал использует 100% CPU - PullRequest
0 голосов
/ 17 июня 2010

Я запускаю сценарий с ./file.py < pipe >> logfile, а сценарий:

while True:
    try:
            I = raw_input().strip().split()
    except EOFError:
            continue
    doSomething()

Как я могу лучше обработать именованный канал?Этот скрипт всегда работает на 100% ЦП и должен быть в режиме реального времени, поэтому я не могу использовать time.sleep.

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

«В реальном времени» (поскольку это очевидно «мягкое» реальное время, если у вас запущено несколько процессов, а не «жесткое» в реальном времени!) Не означает «вы не можете использовать time.sleep ": даже небольшое количество сна сделает вещи немного лучше - попробуйте добавить time.sleep(0.01) в ваш цикл, просто чтобы дать другим процессам лучший шанс для запуска. Недостаток сна может фактически заставить вас занять больше времени, давая другим процессам очень мало шансов заполнить трубу!

Помимо этого, у @ S.Lott все в порядке: для поведения "в реальном времени" вы должны читать с sys.stdin (хотя, возможно, это не обязательно должен быть байт за раз, в зависимости от платформы: обычно sys.stdin.read(1024) будет читать до 1024 байта, когда sys.stdin - это труба или другое «сырое» в отличие от «приготовленного» FD, возвращая сколько бы байтов было в трубе, если <100, скорее чем ожидание - вы можете установить FD на неблокирующую, чтобы убедиться в этом непосредственно, и выполнять манипуляции со строками (например, соединять строки, вырезать их и т. д.) позже в своем коде. </p>

2 голосов
/ 17 июня 2010

В EOF вы будете зацикливаться, получая еще один EOF.После EOF больше ввода не будет.

EOF не означает «пробел» в данных.Это означает, что названный сокет был отключен и больше не может использоваться.

Если вы хотите данные в режиме реального времени, вы должны читать отдельные байты из сокета, пока не получите полное сообщение.Возможно, сообщение заканчивается на '\n'.Вы не можете использовать raw_input.

Вы должны использовать sys.stdin.read(1) для получения байтов.

Трубы, кстати, буферизуются.Так что вы ничего не получите в режиме реального времени.Если вы хотите «в реальном времени», вы должны использовать UDP-сокеты, а не TCP-каналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...