簡體   English   中英

在python(bsddb)中使用Berkeley Db時發生DEADLOCK_WRAP錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM