Когда Popen.communicate () не достаточно? - PullRequest
5 голосов
/ 06 ноября 2010

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

Итак, вот моя проблема: яМне действительно нужно взаимодействовать с подпроцессом обоими способами: мне нужно собрать много данных для их ввода и получить их на лету.Обойти это невозможно.Мой подпроцесс - известный «хромой» кодировщик mp3, входной сигнал - это звук PCM продолжительностью один час или более, генерируемый моей функцией, а выходной файл - это mp3-файл, который также должен быть отправлен пользователю chunk, не дожидаясь завершения кодера.1003 *

Согласно документам, Popen.communicate () не поможет мне обработать IPC, измеряемый в десятках или сотнях мегабайт.В то же время, как я узнал отсюда, пытаться создать этот подход с нуля очень опасно, так как существует множество ловушек: тупики, буферизация, управление процессами и т. Д.

Итак, мой вопросесть: есть какое-то известное решение для такого рода проблемы: библиотека Python или пример кода, который действительно решает проблему?Может быть, по крайней мере, есть статья или что-то явно описывающее большинство проблем, с которыми можно столкнуться, пытаясь решить это самостоятельно?

Заранее спасибо, Илья.

1 Ответ

2 голосов
/ 07 ноября 2010

Самый простой способ - разделить вашу собственную программу на две части: одну, которая пишет в LAME, и другую, которая читает из lame и пишет пользователю.Это гораздо проще сделать, чем иметь двунаправленную связь.

Если это не сработает для вас, я обнаружил, что разработка с именованными каналами намного проще, чем традиционная IPC для каналов.Легко использовать различные виды сантехники во время испытаний. Неблокирующий ввод / вывод в Python 3 должен значительно облегчить доступ к ним.

...