2010-10-16 36 views
5

我有一個Python應用程序,爲了簡短,從遠程服務器接收數據,進行處理,響應於服務器,偶爾保存處理後的數據到磁盤。我遇到的問題是,有一個數據寫的很多和保存過程可能需要半分鐘以上。這顯然是一個阻塞操作,所以網絡IO在這段時間內停滯。我希望能夠在後臺進行保存操作,以便於應用程序繼續與服務器進行合理的快速通信。我應該使用什麼線程模塊來防止磁盤IO阻塞網絡IO?

我知道我可能需要某種線程模塊來完成此操作,但我無法分辨thread,threading,multiprocessing和其他各種選項之間的區別。有人知道我在找什麼嗎?

+1

相關:http://stackoverflow.com/questions/2629680/deciding-between-subprocess-multiprocessing-and-thread-in-python – 2010-10-16 20:36:53

回答

6

既然你是I/O綁定,然後使用threading模塊。

您幾乎從不需要使用thread,它是一個低級別接口; threading模塊是thread的高級接口包裝器。

multiprocessing模塊不同於線程模塊,multiprocessing使用多個子進程來執行任務; multiprocessing恰好使用與threading相同的界面來減少學習曲線。 multiprocessing通常用在當你有CPU綁定的計算,以及需要避免的GIL(全局解釋器鎖)多核CPU英寸

一個稍微更深奧的多線程替代方案是使用asyncore模塊的異步I/O。另一個選項包括Stackless Python和Twisted。

+1

(對不起,編輯)只是想指出,這個答案並不完全特別是關於磁盤I/O的準確性。 異步磁盤I/O與非阻塞不同:阻塞是指系統調用沒有答案,並且保證需要時間 - 換言之,網絡和管道I/O。但是,從磁盤讀取數據時,I/O將永遠不會「阻塞」:它可能很慢。 asyncore和扭曲的重點非阻塞I/O所以不能在這種情況下幫助。主題*應*幫助,但我一直在用盤GIL I/O ... 隨時糾正我在這個咬傷。 – 2012-05-14 18:20:51