Скручено, как ProcessProtocol может получать стандартный вывод без буферизации? - PullRequest
3 голосов
/ 29 марта 2012

Я использую внешний процесс, который записывает короткую строку вывода для каждого блока обрабатываемых данных. Я хотел бы отреагировать после каждой из этих строк без каких-либо дополнительных задержек. Однако, похоже, что .outReceived() из ProcessProtocol буферизовано. Состояние документов:

.outReceived (data): вызывается с данными, полученными от процесс 'стандартный вывод. Трубы, как правило, предоставляют данные в большем куски, чем сокеты (один килобайт - это общий размер буфера) , так что вы может не испытывать поведение "случайных сгустков", типичное для сетевые сокеты, но, тем не менее, вы должны быть готовы к не получите все свои данные за один звонок. Чтобы сделать это правильно, outReceived следует просто накапливать данные и откладывать что-нибудь с ним, пока процесс не закончится.

В результате получается, что я получаю вывод за один фрагмент после завершения всей обработки. Как я могу заставить ProcessProtocol не буферизовать стандартный вывод?

1 Ответ

2 голосов
/ 29 марта 2012

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

Результатом является то, что я получаю вывод в один блок после завершения всей обработки. Как я могу заставить ProcessProtocol не буферизовать стандартный вывод?

Буферизация происходит в процессе производителя, а не потребителя. Стандартная библиотека C stdout буферизируется только при подключении к терминалу, в противном случае она полностью буферизуется. Это то, что заставляет процесс-производитель выводить данные большими порциями, а не построчно, когда он не подключен к терминалу.

Используйте утилиту stdbuf , чтобы заставить процесс-производителя 'stdout быть буферизованным строкой.

Если процесс-производитель является скриптом Python, используйте -u Переключатель интерпретатора Python, чтобы полностью отключить буферизацию стандартных потоков. stdbuf утилита лучше, хотя.

...