Блокирует ли python sys.stdin.read ()? - PullRequest
5 голосов
/ 05 декабря 2010

Я адаптирую эту команду управления Django для своих собственных целей. Этот скрипт представляет собой простой демон while, который читает файл sys.stdin (строка 152, в command.handle()) в соответствии с протоколом и записывает результаты в sys.stdout.

Я ожидал бы, что sys.stdin.read() будет блокироваться, пока не получит что-то, но я обнаружил, что при запуске этого сценария он загружает 100% ЦП до того, как какие-либо данные были отправлены или получены.

  1. Блокирует ли sys.stdin.read(n)?
  2. Если нет, как я могу сделать этого демона более вежливым?
  3. Безопасно ли использовать time.sleep(s), или я пропущу ввод или буду медленно отвечать?

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

По умолчанию sys.stdin.read() и sys.stdin.read(n) блокируют вызовы.Я бы предположил, что загрузка процессора на 100% на самом деле связана с потоковой передачей данных в ваш скрипт или каким-либо другим поведением, не приведенным здесь.

При просмотре справочной документации по sys.stdin.read я заметил следующее:

read (...)

read ([size]) -> read не более байтов размера, возвращается в виде строки.

Если аргумент size отрицателен илиопущен, читайте, пока не будет достигнут EOF. Обратите внимание, что в неблокирующем режиме может быть возвращено меньше данных, чем было запрошено, даже если не задан параметр размера.

(Выделение мое).

Это означает, что режим блокировки является поведением по умолчанию, что соответствует моему опыту.Это также привело меня к поиску аналогичных вопросов по SO.Вуаля: Неблокирующее чтение в подпроцессе. ТРУБА в python

Удачи в адаптации!

1 голос
/ 05 декабря 2010

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

0 голосов
/ 05 декабря 2010

Есть ли вероятность, что поток был закрыт (например, EOF был отправлен)?

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