Python擱置模塊是否具有內置的任何保護以確保兩個進程不同時寫入文件?Python擱置模塊問題
6
A
回答
7
擱置模塊使用底層數據庫包(如dbm,gdbm或bsddb)。
的restrictions pragraph說(我的重點):
的貨架模塊不支持並行讀/寫訪問擱置對象。 (多個同時讀取訪問是安全的。)當一個程序有一個可寫入的架子時,其他程序不應該打開它來讀取或寫入。 Unix文件鎖定可以用來解決這個問題,但是這在Unix版本中是不同的,並且需要關於所使用的數據庫實現的知識。
結論:它取決於操作系統和底層數據庫。爲了保持可移植性,不要建立在併發上。
2
根據最佳答案,擱置多位作者並不安全。我使貨架更安全的方法是編寫一個封裝,用於打開和訪問貨架元素。包裝代碼看起來是這樣的:有興趣的
def open(self, mode=READONLY):
if mode is READWRITE:
lockfilemode = "a"
lockmode = LOCK_EX
shelve_mode = 'c'
else:
lockfilemode = "r"
lockmode = LOCK_SH
shelve_mode = 'r'
self.lockfd = open(shelvefile+".lck", lockfilemode)
fcntl.flock(self.lockfd.fileno(), lockmode | LOCK_NB)
self.shelve = shelve.open(shelvefile, flag=shelve_mode, protocol=pickle.HIGHEST_PROTOCOL))
def close(self):
self.shelve.close()
fcntl.flock(self.lockfd.fileno(), LOCK_UN)
lockfd.close()
2
我實現Ivo's approach爲上下文管理器,任何人:
from contextlib import contextmanager, closing
from fcntl import flock, LOCK_SH, LOCK_EX, LOCK_UN
import shelve
@contextmanager
def locking(lock_path, lock_mode):
with open(lock_path, 'w') as lock:
flock(lock.fileno(), lock_mode) # block until lock is acquired
try:
yield
finally:
flock(lock.fileno(), LOCK_UN) # release
class DBManager(object):
def __init__(self, db_path):
self.db_path = db_path
def read(self):
with locking("%s.lock" % self.db_path, LOCK_SH):
with closing(shelve.open(self.db_path, "c", 2)) as db:
return dict(db)
def cas(self, old_db, new_db):
with locking("%s.lock" % self.db_path, LOCK_EX):
with closing(shelve.open(self.db_path, "c", 2)) as db:
if old_db != dict(db):
return False
db.clear()
db.update(new_db)
return True
相關問題
- 1. Python擱置模塊的大小問題
- 2. Python擱置模塊內存消耗
- 3. Python模塊問題
- 4. Python模塊問題
- 5. Python模塊問題
- 6. python擱置dbm.error?
- 7. Python中的擱架模塊3.1.1
- 8. 有關在TFS中擱置/擱置的問題
- 9. persistenc e gtk.view與擱置模塊
- 10. Python請求模塊放置問題
- 11. Python的擱置模塊是否使用內存映射IO?
- 12. Python模塊導入問題
- 13. Python socket模塊的問題
- 14. Python模塊安裝問題
- 15. pyGTrends模塊的問題 - PYTHON
- 16. 安裝Python模塊問題
- 17. Python模塊導入問題
- 18. python模塊導入問題
- 19. python模塊更改問題
- 20. 如何在Mel中調用Python以及圖標擱置問題
- 21. python檢查模塊的問題-python
- 22. 擱置無法擱架
- 23. 模塊問題
- 24. 等效於Java中的python擱架模塊
- 25. python的Numba問題,沒有模塊llvmlite.binding
- 26. 模塊化的Python輸出問題
- 27. 問題與Python模塊中導入
- 28. 在Python模塊裏面的Javascript問題
- 29. 另一個Python模塊重裝問題
- 30. SWIG python模塊創建問題
順便說一句我認爲限制比較並交換特定頂級的但我不確定更新密鑰是否可能不會覆蓋所有其他密鑰,也可能依賴於底層數據庫,因此更好地鎖定整個事情並保證安全 – 2011-11-15 17:48:00