我有一个 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.lockfor /tmp/example/,如果您/tmp/用作缓存目录(因为它尝试做/tmp.lock)..
简而言之,我需要将urllib2响应缓存到磁盘。为此,我需要以多进程安全的方式访问一个已知目录(如果需要,创建它)。它需要在 OS X、Linux 和 Windows 上运行。
想法?我能想到的唯一替代解决方案是使用 SQLite3 存储而不是文件重写缓存模块。