неблокирующий ввод / вывод в трубе - PullRequest
1 голос
/ 04 ноября 2011

У меня есть один процесс, который собирает данные в реальном времени, и другой процесс, который их отображает. Два процесса связаны между собой конвейером, причем процесс сбора данных обеспечивает процесс построения графика.

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

Есть ли способ сделать неблокирующую трубу оболочки а-ля C's O_NONBLOCK? Мне все равно, если одна точка данных не отображается, потому что она перезаписывается более новой точкой ...

РЕДАКТИРОВАТЬ: На самом деле, я думаю, что конвейерный буфер достаточно велик, чтобы хранить выходные данные процесса сбора данных без необходимости немедленной обработки части построения.

1 Ответ

1 голос
/ 04 ноября 2011

Если процесс сбора данных должен выполняться беспрепятственно в процессе построения графика, вам нужна другая структура, чем труба, соединяющая два - или вам нужен дополнительный процесс в середине, который может отбрасывать старые точки данных, которые еще не были отправленык плоттеру.

Концептуально:

+-------------+    +------------+    +-------+
| Acquisition |--->|Holding Tank|--->|Plotter|
+-------------+    +------------+    +-------+

«Резервуар» может использовать select() или аналогичный вызов в своих дескрипторах ввода и вывода и может содержать конечное количествоТочки данных.Когда из процесса сбора данных приходит новая точка, если ее накопительный резервуар заполнен, он может отбросить самую старую точку и добавить новую вместо нее.Если на входе плоттера есть место, он может записать новую точку данных на плоттер.В то же время процесс сбора данных может протекать полностью (до тех пор, пока накопительный резервуар никогда не блокирует его), и плоттер также может работать на ровном месте.Все эти три процесса связаны трубами.Ни одна из труб не работает как неблокирующая операция.

...