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搁置dbm.error?
- 4. Python模块问题
- 5. persistenc e gtk.view与搁置模块
- 6. 有关在TFS中搁置/搁置的问题
- 7. Python请求模块放置问题
- 8. Python的搁置模块是否使用内存映射IO?
- 9. 安装Python模块问题
- 10. pyGTrends模块的问题 - PYTHON
- 11. python模块导入问题
- 12. Python模块导入问题
- 13. Python模块导入问题
- 14. Python socket模块的问题
- 15. python检查模块的问题-python
- 16. 搁置无法搁架
- 17. 模块问题
- 18. 导入python模块的问题
- 19. 模块化的Python输出问题
- 20. 基本Python模块设计问题
- 21. python的Numba问题,没有模块llvmlite.binding
- 22. python的MySQLdb模块安装问题
- 23. 如何使用搁置模块保存一个pygame雪碧组
- 24. 的Python:问题与本地模块阴影的全球模块
- 25. Python的机械化模块代理设置问题
- 26. zend模块特定配置问题
- 27. JavaScript模块问题?
- 28. pywebhdfs模块问题
- 29. printSoln模块问题
- 30. 无法打开Python搁置对象
顺便说一句我认为限制比较并交换特定顶级的但我不确定更新密钥是否可能不会覆盖所有其他密钥,也可能依赖于底层数据库,因此更好地锁定整个事情并保证安全 – 2011-11-15 17:48:00