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