相关疑难解决方法(0)

在Python中创建竞争条件文件夹

我有一个urllib2缓存模块,由于以下代码,它偶尔会崩溃:

if not os.path.exists(self.cache_location):
    os.mkdir(self.cache_location)
Run Code Online (Sandbox Code Playgroud)

问题是,到第二行执行时,文件夹可能存在,并将出错:

  File ".../cache.py", line 103, in __init__
    os.mkdir(self.cache_location)
OSError: [Errno 17] File exists: '/tmp/examplecachedir/'

这是因为脚本同时启动了很多次,由第三方代码我无法控制.

代码(在我尝试修复bug之前)可以在github上找到

我不能使用tempfile.mkstemp,因为它通过使用随机命名的目录(tempfile.py source here)来解决竞争条件,这会破坏缓存的目的.

我不想简单地丢弃错误,因为如果文件夹名称作为文件存在(不同的错误),则会引发相同的错误Errno 17错误,例如:

$ touch blah
$ python
>>> import os
>>> os.mkdir("blah")
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 17] File exists: 'blah'
>>>

我无法使用,threading.RLock因为代码是从多个进程调用的.

所以,我尝试编写一个简单的基于文件的锁(这个版本可以在这里找到),但是这有一个问题:它创建一个级别的锁文件,所以/tmp/example.lock对于/tmp/example/,如果你/tmp/用作缓存目录,它会中断(因为它尝试制作/tmp.lock)..

简而言之,我需要缓存urllib2对光盘的响应.为此,我需要以多进程安全的方式访问已知目录(如果需要,创建它).它需要在OS X,Linux和Windows上运行.

思考?我能想到的唯一替代解决方案是使用SQLite3存储而不是文件重写缓存模块.

python caching race-condition

16
推荐指数
3
解决办法
4581
查看次数

为什么测试"$?" 一个反模式,看一个命令是否成功?

在这里看到测试是否$?是零(成功)或其他东西(失败)是反模式,但我无法在其他任何地方找到它.

坚持维基百科反模式的定义:"反模式(或反模式)是对反复出现的问题的常见反应,这种反复出现的问题通常是无效的,并且可能会产生极大的反作用." 为什么这会是反模式?

bash shell sh

8
推荐指数
1
解决办法
476
查看次数

标签 统计

bash ×1

caching ×1

python ×1

race-condition ×1

sh ×1

shell ×1