使用Python中的Berkeley Db时发生DEADLOCK_WRAP错误(bsddb)

2024-10-01 11:42:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用berkdb存储一个庞大的键值对列表,但由于某些原因,当我稍后尝试访问某些数据时,我收到以下错误:

try:
    key = 'scrape011201-590652'
    contenttext = contentdict[key]
except:
    print the error


<type 'exceptions.KeyError'> 'scrape011201-590652' in 
contenttext = contentdict[key]\n', '  File "/usr/lib64/python2.5/bsddb/__init__.py",
line 223, in __getitem__\n    return _DeadlockWrap(lambda: self.db[key])  #   
self.db[key]\n', 'File "/usr/lib64/python2.5/bsddb/dbutils.py", line 62, in 
DeadlockWrap\n    return function(*_args, **_kwargs)\n', '  File 
"/usr/lib64/python2.5/bsddb/__init__.py", line 223, in <lambda>\n    return 
_DeadlockWrap(lambda: self.db[key])  # self.db[key]\n']

我不知道死锁是什么,但是没有任何其他程序或进程访问或写入berkdb(据我所知),所以不确定我们如何能得到一个死锁,如果它是指这个。有没有可能我正在尝试快速访问数据?我有一个循环函数调用,所以

^{pr2}$

我用多个数据集运行这个程序,这个错误只发生在其中一个,最大的一个,而不是其他的。在


Tags: 数据lambdakeyinpyselfdbreturn
2条回答

我很确定DeadlockWrap的东西与这里无关。这只是automagically provide retries with a back-off strategy的一种方法。换言之,如果数据库操作失败,它会等待一段时间,然后再次尝试,在最终失败之前会多次尝试。在

您似乎正在从字典get操作中获取KeyError,这很可能是因为您所使用的密钥实际上并不存在于数据库中。在

尝试使用以下代码:

try:
    key = 'scrape011201-590652'
    if not contentdict.has_key(key):
        print "Urk!, No record for %s"%(key)
    contenttext = contentdict[key]
except:
    print the error

如果表中不存在该记录,这将显示您(通过输出Urk!消息)。至于你在这种情况下要做什么,这取决于你的架构。您可能希望返回None或空字符串。你可能还想做你现在正在做的事情(引发一个异常)。在

contenttext = contentdict[key] if contentdict.has_key(key) else None

相关问题 更多 >