2009-12-20 47 views
1

我正在寫一個用戶可以訪問圖像的python服務(pyamf)。所有圖像都存儲在中央服務器上。 python服務將在有網絡訪問服務器的衛星機器上運行。該服務應該如下工作:Python服務文件緩存Apache競爭條件

  1. 本地檢查以查看文件是否存在,如果存在,請使用它。
  2. 本地檢查是否正在從服務器傳輸文件(file.part存在且大小正在更改)。如果是這樣,等待下載完成,然後使用文件。
  3. 如果文件不存在且文件未被下載,請通過urlretrieve下載文件。

問題在於Apache的多線程。線程同時到達文件存在檢查,因此他們都認爲文件需要下載。不用說,這不好。

什麼是正確的方式來處理這種競爭條件?

謝謝!

回答

1

我猜它是一個線程或分叉的Apache,但效果將是相同的,因爲他們正在訪問遠程資源。

這個問題有時被稱爲「狗堆」問題,它的燒杯緩存庫(http://beaker.groovie.org)解決的問題之一。它提供了一個系統,通過該系統可以創建一個可調用的「創建」一個新的緩存值,在這種情況下,如果某個值尚不存在,則該URL將對應於所提取的某個圖像。使用鎖定是爲了使併發線程或進程等待被選爲「創建者」的單個進程完成其操作。燒杯將使用鎖定文件(如果在類似unix的多進程系統上配置)或者在Windows系統上使用互斥鎖(mutex)。

我是燒杯的膽量和本Bangert的原始作者,他把它包裝起來用於Pylons。