2010-06-16 31 views
0

模塊級別字典'd',並由django Web應用程序中的不同線程/請求訪問。我需要每分鐘更新一次新的數據,過程大約需要5秒。更新模塊級別的共享字典

什麼可能是最好的解決方案,我希望用戶得到舊值或d的新值,而在兩者之間沒有任何值。

我可以想象一個解決方案,它使用新數據構建temp數據字典並將其分配給'd',但不知道這是如何工作的!

欣賞你的想法。

感謝

回答

2

可能是最好的 - 在模塊級:

import threading 
dlock = threading.Lock() 
d = {} 

訪問d(!只是修改)是with塊中:

with dlock: 
    found = k in d 

之類的(如果你在Python 2.5,喲你還需要在你的模塊的頂部有from __future__ import with_statement)。

這可以保護d鎖,因此更改將被序列化。在不修改訪問d的情況下還需要警衛的原因是,如果字典在右下方的操作中被更改,那麼即使在「類似於讀取」的操作(if k in d:d.get(k)等)中,您也可能會遇到問題。中間「。其他體系結構可以基於包裝字典(或者使用鎖來保護其所有需要的方法,或者委託一個特殊用途的線程來執行所有字典操作並通過Queue.Queue實例與所有其他線程通信),但我認爲,在這種特殊情況下,簡單的,沒有多餘的解決方案可以發揮最佳效果。

+0

用戶不得不等待d被修改或者他們仍然可以獲得d的舊值。 – Vishal 2010-06-16 02:11:08

+0

@Vishal,他們必須等待獲得鎖的幾微秒 - 我懷疑有人會注意到;-)。 「拍攝快照」需要更長的時間,如果兩個線程都這樣做,然後每個原子保存其修改後的版本,則一個線程的更改將完全丟失(即使完全不同的鍵&c - 它們將會消失進入乙醚)。 – 2010-06-16 02:32:00

+0

@Alex,如果更新d需要幾秒鐘,那麼線程將等待鎖定?還是你的意思是把te​​mp分配給d中的問題? – Vishal 2010-06-16 03:01:16