2015-07-20 62 views
3

在我的計劃之一,我有以下方法:異步文件IO在多線程應用程序具有可變折射率

def set_part_content(self, part_no, block_no, data): 
    with open(self.file_path, "rwb+") as f: 
     f.seek(part_no * self.constant1 + block_no * self.constant2) 
     f.write(data) 

我這樣做是這種方式,因爲以下內容:

  • 我必須寫在不同的索引(之所以f.seek在這裏)
  • 並且此函數是線程安全的(感謝with語句)

我的問題是這個函數被稱爲大約10k到100k次,而且由於打開/關閉時間,顯然它確實非常慢(它代表了我最關鍵的一組功能的一半執行時間)。

由於f.seek,我無法直接在__init__函數中打開文件以便對其進行操作(如果2個線程同時使用該函數,則會導致這兩個函數之一的索引不正確,這是至關重要的)。

有沒有可以加速此功能的模塊/方式?

+0

等待等待等待。什麼?自從''with'語句何時神奇地使代碼對多線程使用安全?你確定你不會混淆使用'with'來進入和退出一個受鎖定保護的代碼塊(例如'threading.Lock')嗎? PEP-343和'with'的文件都不支持你的說法,這也是我的消息。索賠的來源是什麼? – 0xC0000022L

+0

不,「with」語句不能安全地使這個線程。但Python中的I/O文件是線程安全的。 – FunkySayu

+0

嗯...它更多的是我使用的線程安全的事實:2線程永遠不會同時寫入文件的同一部分。 – FunkySayu

回答

1

我不熟悉python,所以我不確定with語句是否會使這個函數線程安全或不安全。

如果是這樣,則不會有2個線程同時使用該函數。

如果沒有,你的函數不是線程安全的。您需要鎖定以確保線程安全。你可以檢查implementing file locks using Python's with statement。另一個選擇是使這個函數異步,並讓單線程來處理所有的寫入。

+0

是的,在Python中使用標準庫('open [...] f'或'f = open(...)[f.close()')的IO文件是線程安全的。 m更多地尋找一個「緩存文件管理器」,這將允許我異步處理我的I/O,如果我讀取該文件,它將首先檢查在讀取文件之前是否有任何更改已準備好提交。這是我自己的嗎? – FunkySayu

+0

是的,你可以很容易地用Queue來實現它。如果你讓同一個線程來處理讀寫操作,你不需要檢查等待寫操作,這簡化了邏輯。 –