更新模块级共享字典

时间:2010-06-16 01:09:36

标签: python

模块级字典“d”,由django Web应用程序中的不同线程/请求访问。我需要每分钟用新数据更新'd',这个过程大约需要5秒钟。

什么是最好的解决方案,我希望用户获得d的旧值或新值,而两者之间没有任何内容。

我可以想到一个解决方案,其中临时字典用新数据构建并分配给'd'但不确定它是如何工作的!

欣赏你的想法。

由于

1 个答案:

答案 0 :(得分:2)

可能最好 - 在模块级别:

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

对<{1}}的每次访问权限(只是修改!)都在d块内:

with

之类的(如果您使用的是Python 2.5,则还需要在模块的顶部放置with dlock: found = k in d )。

这可以通过锁保护from __future__ import with_statement,因此更改会被序列化。围绕对d的非修改访问还需要防护的原因是,即使在“类似读取”的操作(dif k in d:等)中,如果dict得到“从中间的操作中改变了”。

替代架构可以基于包装字典(要么用锁保护所有需要的方法,要么委托专用线程来执行所有字典操作并通过d.get(k)与所有其他线程通信实例),但我认为在这种特殊情况下,简单,简洁的解决方案最适合。