2010-11-06 30 views
5

我發現很多線程或多或少與這個主題相關,並且仍然幾乎沒有像完整的答案......我正在尋找你的建議。當Popen.communicate()不夠?

所以,這裏是我的問題:我真的需要在這兩個方面與子進程進行通信:我要賴特大量的數據,以它的輸入並獲取其上飛輸出。沒有其他辦法了。我的子過程是着名的'lame'mp3編碼器,輸入是由我的函數產生的一個小時或更長時間的PCM聲音,輸出是也不得不等待編碼器完成的,還必須通過塊發送給用戶塊的mp3文件。

根據文檔,Popen.communicate()絕不會幫我處理IPC幾十或幾百兆的測量。與此同時,正如我從這裏學到的,嘗試從頭開始創建這種方法非常危險,因爲很多陷阱正在等待:死鎖,緩衝,進程管理等。

所以,我的問題是:是否有這種問題的一些衆所周知的解決方案:一個python庫或代碼示例真的能解決這個問題?可能至少有一篇文章或一些東西清楚地描述了人們可以通過自己來解決這個問題的大多數問題?

謝謝你在前進,伊利亞 。

回答

2

最簡單的方法就是分裂你兩個自己的程序:其中一個寫入LAME和從跛腳讀取和寫入到用戶的其他。這比做雙向通信容易得多。

如果這對您不起作用,我發現使用命名管道進行開發比傳統管道IPC更容易。在測試過程中使用各種管道很容易。 Nonblocking I/O in Python 3應該使訪問更容易。

+0

如果我有你的想法,我要推出三個子過程:一個用於創建輸入數據,並將其寫入瘸,一到執行的是跛腳本身和一個獲得輸出,並將其傳送到用戶。這裏讓我感到害怕的是,我必須執行整個監督邏輯:等待孩子,捕捉信號並在父出口處殺死孩子,反過來等等。 – izhak 2010-11-06 21:33:32

+0

至於Python 3中的NB - 謝謝,我會讀它。不幸的是,這個特定的任務必須在Python 2.4的一些共享主機上運行,​​這是一個可悲的現實。 – izhak 2010-11-06 21:35:41

+0

這三個孩子正是我想到的。但是你是對的,實施起來仍然很煩人。有關這些問題的最佳討論仍然是UNIX環境下的高級編程 - 請參閱http://www.kohala.com/start/apue.html - 我強烈建議。 – max 2010-11-07 09:01:13