[英]DEADLOCK_WRAP error when using Berkeley Db in python (bsddb)
我正在使用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']
我不確定DeadlockWrap是什么,但是沒有其他程序或進程訪問berkdb或對其進行寫入(據我所知),因此不確定如果提到了死鎖,我們怎么能得到死鎖。 我是否可能試圖快速訪問數據? 我有一個循環中的此函數調用,所以像
for i in hugelist:
#try to get a value from the berkdb
#do something with it
我正在使用多個數據集運行此錯誤,並且僅在其中一個(最大的一個)上發生此錯誤,而其他錯誤則沒有。
我敢肯定, DeadlockWrap
內容與這里無關。 這只是一種自動為重試提供退避策略的方法 。 換句話說,如果數據庫操作失敗,它會稍等一會,然后重試幾次,直到最終失敗。
您似乎正在從字典的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.