2010-03-07 49 views
4

我有多個python進程(通常每個核心1個)轉換大量數據,每個數據都從專用源讀取,並寫入到每個以附加模式打開的單個輸出文件。如何讓多個python程序將行附加到同一個文件?

這是這些程序工作的安全方式嗎?

由於嚴格的性能要求和龐大的數據量,我不認爲我可以讓每個進程反覆打開關閉文件&。另一種選擇是每次寫入一個專用的輸出文件,並且一個進程完成後將其連接在一起。但我寧願避免這種情況。

在此先感謝任何&的所有答案和建議。

回答

4

您是否考慮過使用multiprocessing模塊以類似於線程的方式在正在運行的程序之間進行協調?特別參見隊列接口;您可以在完成後將每個已完成的工作項目放置在隊列中,並讓單個進程讀取隊列並寫入輸出文件。

或者,您可以讓每個子進程維護一個獨立的管道,以便與父進程進行select()調用,並在適當時將數據複製到輸出文件。當然,這可以通過「手動」(沒有多處理模塊)以及使用它來完成。或者,如果您避免使用線程的原因是爲了避免全局解釋器鎖定,那麼可以考慮使用非CPython實現(如Jython或IronPython)。

+0

假設有8個進程,每個向一個文件寫入250,000個100字節的記錄並排序並不重要 - 這是使用命名管道使用最簡單的方法嗎? – KenFar 2010-03-07 22:32:05

+0

@KenFar - 每個進程都有一個命名管道到一個單獨的進程,除了從這些管道讀取數據(一次一個記錄,使用select調用找出哪些管道立即可讀),並寫入單個輸出文件。使用管道的最簡單方法是使用多處理模塊,並讓它自動爲您設置管道。 (使用_named_ pipes可能不必要的複雜性;如果所有這些進程都是由單個父進程啓動的,則沒有意義)。 – 2010-03-07 22:52:01

4

你的程序是在沒有崩潰將導致「安全」,但數據從不同的進程未來(非常不吉利的時間)可混合起來 - 例如,過程1追加的a秒的長字符串,處理2一長串b,你可能最終在文件中有很多a s,然後b s,然後更多a s(或其他組合/混合)。

問題是,.write不保證足夠長的字符串參數是原子。如果你的參數邊界很狹窄,比你的fs/os的塊大小還要小,你可能會很幸運。否則,請嘗試使用logging模塊,該模塊確實採取更多預防措施(但可能這些預防措施可能會降低速度......您需要進行基準測試),因爲它的目標是「日誌文件」,這些日誌文件通常會被多個程式。

相關問題