2010-11-06 16 views
5

Znalazłem wiele wątków mniej lub bardziej związanych z tym tematem i nadal prawie nic jak pełna odpowiedź ... Szukam twojej porady na ten temat.Kiedy Popen.communicate() to za mało?

Oto mój problem: naprawdę muszę komunikować się z podprocesorem w obie strony: muszę wprowadzić wiele danych do ich danych wejściowych i uzyskać ich wyniki w locie. Nie da się tego obejść. Mój podproces to słynny "lame" koder mp3, wejście to godzina lub więcej długich dźwięków PCM generowanych przez moją funkcję, a wyjście to plik mp3, który również musi zostać przesłany do kawałka użytkownika przez porcję bez czekania na zakończenie kodera.

Według dokumentów Popen.communicate() nie pomoże mi obsłużyć IPC mierzonego w dziesiątkach lub setkach megabajtów. W tym samym czasie, jak się dowiedziałem, jest bardzo niebezpieczne, aby spróbować stworzyć to podejście od zera, ponieważ czekają na nas wiele pułapek: zakleszczenia, buforowanie, zarządzanie procesami itp.

Moje pytanie brzmi: czy jest jakieś dobrze znane rozwiązanie tego rodzaju problemu: lib Pythona lub przykład kodu, który naprawdę rozwiązuje problem? Być może jest przynajmniej artykuł lub coś, co jasno opisuje większość problemów, które można napotkać, próbując rozwiązać to samodzielnie?

Z góry dziękuję, Ilya.

Odpowiedz

2

Najprostszym sposobem jest podzielenie własnego programu na dwie części: jedną, która pisze do LAME, a druga czyta z lame i pisze do użytkownika. Jest to znacznie łatwiejsze niż komunikacja dwukierunkowa.

Jeśli to nie działa, odkryłem, że programowanie z użyciem nazwanych rur jest łatwiejsze niż tradycyjne IPC rur. Podczas testowania łatwo jest zastosować różnego rodzaju instalacje hydrauliczne. Nonblocking I/O in Python 3 powinien ułatwić dostęp do nich.

+0

Jeśli mam twój pomysł, muszę uruchomić trzy proces potomny: jeden do tworzenia danych wejściowych i pisania do lame, jeden do uruchomienia lame i jeden, aby uzyskać wyjście i przenieść go do użytkownika. To, co mnie przeraża, to myśl, że będę musiał wprowadzić w życie całą logikę nadzorczą: poczekaj na dzieci, złap sygnały i zabij dzieci na wyjściu rodziców i odwrotnie itd. Itd. – izhak

+0

Co do NB w Pythonie 3 - dziękuję, Przeczytam to. Niestety to konkretne zadanie musi działać na kilku współdzielonych hostiach, w których Python 2.4 jest smutną rzeczywistością. – izhak

+0

Troje dzieci było dokładnie tym, o czym myślałem. Ale masz rację, nadal jest to irytujące do wdrożenia. Najlepszą dyskusją na temat zagadnień jest nadal zaawansowane programowanie w środowisku UNIX - patrz http://www.kohala.com/start/apue.html - które bardzo polecam. – max

Powiązane problemy