Как читать из os.pipe () без блокировки? - PullRequest
9 голосов
/ 23 марта 2009

Я пытаюсь читать из открытого os.pipe(), чтобы посмотреть, пусто ли оно в момент чтения. Проблема в том, что при вызове read() программа блокируется там до тех пор, пока там на самом деле не будет что-то прочитать, но не будет, если тест, который я делаю, прошел успешно.

Я знаю, что могу использовать select.select() с таймаутом, однако я хотел знать, есть ли другое решение проблемы.

1 Ответ

15 голосов
/ 23 марта 2009

Вы можете попробовать это.

import os, fcntl
fcntl.fcntl(thePipe, fcntl.F_SETFL, os.O_NONBLOCK) 

При этом thePipe.read() должно быть неблокирующим.

Из pipe (7) Справочная страница:

Если процесс пытается прочитать из пустая труба, затем читать (2) заблокирует пока данные не доступны. (...) Неблокирующая операция ввода / вывода возможна при использовании операция fcntl (2) F_SETFL для включить O_NONBLOCK статус открытого файла флаг.

...