Чтение стандартного вывода из подпроцесса из основного процесса с использованием PIPE, вызвавшего смерть подпроцесса - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть простой код:

proc = subprocess.Popen(["/home/root/cc6ul/./IQ-sampler", str(self.num_files), str(self.n), self.results_directory, self.device_id, self.rid, self.cc6ul_state_filepath], stdout=subprocess.PIPE)

while proc.poll() is None:
    line = proc.stdout.readline()
    self.log.info("line:{}".format(line))

Это приводит к тому, что мой процесс IQ-сэмплера до времени d ie. Но если я запускаю его прямо из терминала, у него нет проблем. Я попытался отладить это, но я не понимаю причину root. Это труба связи, которая вызывает проблемы? Поскольку это единственная связь, которую я вижу между двумя процессами.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

После большой отладки проблема, похоже, заключается в IQ-семплере linux C обратного вызова таймера, который использовал уведомление потока SIGEV_THREAD. Включение обратного вызова таймера в критическую секцию с использованием блокировок, похоже, решило эту проблему.

Интересно то, что только тогда, когда другие процессы (здесь основной python процесс) работает, IQ-семплер умирает, что приводит меня полагать, что нагрузка на процессор, вероятно, усугубляет проблемы параллелизма.

0 голосов
/ 24 апреля 2020

Если команда работает на терминале, вы можете просто передать shell=True и фактическую команду в функцию Popen. Это должно иметь тот же результат, что и выполнение команды в оболочке.

...