#python #subprocess
#питон #подпроцесс
Вопрос:
У меня есть программа, которая непрерывно считывает данные с датчика, выводит их в stdout и сбрасывает stdout. Он довольно часто считывает показания датчика. Я хотел бы, чтобы моя программа на Python захватила вывод из этой программы и сделала что-то интересное с данными. Я достигаю этого с помощью subprocess
модуля. Все отлично работает около ~30 минут или около того, затем внезапно код зависает в ожидании следующей строки.
Вот соответствующий код.
with subprocess.Popen( run_my_program, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, ) as proc: for line in proc.stdout: do_something(line)
Мое единственное предположение, возможно do_something
, медленнее, чем скорость входящих данных, что приводит к заполнению буфера вывода. Что происходит в этом случае? Или я чего-то еще не понимаю?
Комментарии:
1. Как воспроизвести это поведение?
2. Я не уверен.. Я пытался искусственно увеличить
do_something
время, но, похоже, нет никакого линейного влияния на то, когда он перестает работать.3. Вы знаете, как быстро сенсорная программа отправляет данные? Если вы этого не сделаете, вы могли бы попробовать измерить его, просто посчитав строки из stdout, вместо того, чтобы запускать, возможно, отнимающую много времени функцию do_something. Пока вы не узнаете какие-то конкретные данные о том, как быстро приходят строки и как медленно что-то происходит, вы просто предполагаете.
4. Хорошее предложение. Сделал кое-какие замеры. Датчик посылает строку данных со скоростью около 25 Гц.
do_something
кажется, что она работает со скоростью около 400 Гц, так что должно быть что-то еще.