簡體   English   中英

Python shelve.open 上的資源暫時不可用

[英]Resource temporarily unavailable on Python shelve.open

我有一個執行以下操作的 Python 應用程序:

  • 由另一個進程/進程每 2-3 分鍾調用一次,以使用with shelve.open(shelvefilename, flag='c')存儲對象。
  • 為了使用以讀取貨架文件被另一個過程調用/處理每分鍾多次with shelve.open(shelvefilename, flag='r')

問題是有時我會收到_gdbm.error: [Errno 11] Resource temporarily unavailable錯誤:

   File "/path/to/myprog.py", line 755, in mymethod
    with shelve.open(shelvefilename, flag='r') as shlvfile:
  File "/usr/local/lib/python3.6/shelve.py", line 243, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/local/lib/python3.6/shelve.py", line 227, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/local/lib/python3.6/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: [Errno 11] Resource temporarily unavailable

我的猜測是發生這種情況是因為在某個時刻我打開了擱置文件以進行讀寫操作,這在定義上是有問題的。

有什么方法可以在不干擾讀取操作的情況下更新擱置文件?

這更多是一個觀念問題。 如果一個進程修改文件中的數據而另一個進程同時讀取它,結果是一種不可預測的。

想象一下,您讀取了文件的一部分,此時僅寫入了某個值的一半。 讀取只會無法正確解析條目,也可能無法正確解析所有后續條目。 換句話說,它遲早會破裂。

我認為最好的方法是將“擱置”集中在一個進程中或使用數據庫。

我剛剛在一個小模塊中使用擱置來緩存匯率時遇到了這個問題。 您可以使用 python 線程和全局threading.Lock()對象來解決這個問題。

from threading import Lock
import shelve

mutex = Lock()

mutex.acquire()
db = shelve.open(db_name)
# write to db
db.close()
mutex.release()

可以在@ http://georg.io/2014/06/Python-Shelve-Thread-Safety找到代碼片段的原始來源和該想法的功勞

```threading.Lock()`` 對象通過阻塞其他 python 線程來工作,直到它被釋放。 https://docs.python.org/2/library/threading.html#lock-objects

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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