Errore di DEADLOCK_WRAP quando si utilizza Berkeley Db in python (bsddb)
-
24-09-2019 - |
Domanda
Sto usando un berkdb per memorizzare un elenco enorme di coppie chiave-valore, ma per qualche ragione quando provo ad accedere ad alcuni dei dati in seguito ottengo questo errore:
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']
Non sono sicuro di quello che è DeadlockWrap, ma non v'è nessun altro programma o processo l'accesso alla berkdb o scrivere ad essa (per quanto ne so,) quindi non so come siamo riusciti a ottenere una situazione di stallo, se riferiva a questo. E 'possibile che sto cercando di accedere ai dati per rapidamente? Ho questa funzione di chiamata in un ciclo, in modo da qualcosa come
for i in hugelist:
#try to get a value from the berkdb
#do something with it
Sto facendo funzionare questo con più set di dati e questo errore si verifica solo con uno di loro, il più grande, non gli altri.
Soluzione
Sono abbastanza certo la roba DeadlockWrap
non è rilevante qui. E 'semplicemente un modo per automagically forniscono tentativi con un back-off strategia . In altre parole, se la manipolazione del database non riesce, attende un po 'poi ci riprova, un certo numero di volte prima infine fallire.
Ti sembra di essere sempre un KeyError
dalla vostra operazione get
dizionario che è più probabile che sia dovuto al fatto che la chiave che si sta utilizzando in realtà non esiste nel database.
Prova il codice con qualcosa di simile:
try:
key = 'scrape011201-590652'
if not contentdict.has_key(key):
print "Urk!, No record for %s"%(key)
contenttext = contentdict[key]
except:
print the error
Questo dovrebbe mostrare se il record non esiste nella tabella (emettendo il messaggio Urk!
). Quanto a ciò che si fa in questo caso, dipende dalla vostra architettura. Probabilmente si vorrebbe tornare sia None
o una stringa vuota. Si consiglia inoltre di fare esattamente quello che stai facendo ora (sollevando un'eccezione).
Altri suggerimenti
contenttext = contentdict[key] if contentdict.has_key(key) else None