模块级字典“d”,由django Web应用程序中的不同线程/请求访问。我需要每分钟用新数据更新'd',这个过程大约需要5秒钟。
什么是最好的解决方案,我希望用户获得d的旧值或新值,而两者之间没有任何内容。
我可以想到一个解决方案,其中临时字典用新数据构建并分配给'd'但不确定它是如何工作的!
欣赏你的想法。
由于
答案 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
的非修改访问还需要防护的原因是,即使在“类似读取”的操作(d
,if k in d:
等)中,如果dict得到“从中间的操作中改变了”。
替代架构可以基于包装字典(要么用锁保护所有需要的方法,要么委托专用线程来执行所有字典操作并通过d.get(k)
与所有其他线程通信实例),但我认为在这种特殊情况下,简单,简洁的解决方案最适合。