【发布时间】:2010-12-07 21:11:53
【问题描述】:
我有一个 urllib2 缓存模块,由于以下代码偶尔会崩溃:
if not os.path.exists(self.cache_location):
os.mkdir(self.cache_location)
问题是,在执行第二行的时候,文件夹可能已经存在,会报错:
文件“.../cache.py”,第 103 行,在 __init__ 中
os.mkdir(self.cache_location)
OSError: [Errno 17] 文件存在:'/tmp/examplecachedir/'
这是因为脚本多次同时启动,第三方代码我无法控制。
代码(在我尝试修复错误之前)可以找到here, on github
我不能使用 tempfile.mkstemp,因为它通过使用随机命名的目录 (tempfile.py source here) 来解决竞争条件,这会破坏缓存的用途。
我不想简单地丢弃错误,因为如果文件夹名称作为文件存在(不同的错误),则会引发相同的错误 Errno 17 错误,例如:
$ 触摸等等
$蟒蛇
>>> 导入操作系统
>>> os.mkdir("废话")
回溯(最近一次通话最后):
文件“”,第 1 行,在
OSError:[Errno 17] 文件存在:'blah'
>>>
我不能使用threading.RLock,因为代码是从多个进程调用的。
所以,我尝试编写一个简单的基于文件的锁 (that version can be found here),但这有一个问题:它会在上一级创建锁文件,因此 /tmp/example.lock 用于 /tmp/example/,如果使用 @987654329,则会中断@ 作为缓存目录(因为它试图使/tmp.lock)..
简而言之,我需要将urllib2 响应缓存到磁盘。为此,我需要以多进程安全的方式访问一个已知目录(如果需要,创建它)。它需要在 OS X、Linux 和 Windows 上运行。
想法?我能想到的唯一替代解决方案是使用 SQLite3 存储而不是文件来重写缓存模块。
【问题讨论】:
标签: python caching race-condition