Python搁置模块问题
Python shelve 模块是否内置任何保护以确保两个进程不会同时写入文件?
Does the Python shelve module have any protection built in to make sure two processes aren't writing to a file at the same time?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
shelve 模块使用底层数据库包(例如 dbm、gdbm 或bsddb)。
限制段落说(我的重点):
结论:这取决于操作系统和底层数据库。 为了保持可移植性,不要建立在并发之上。
The shelve module uses an underlying database package (such as dbm, gdbm or bsddb) .
The restrictions pragraph says (my emphasis):
Conclusion: it depends on OS and the underlying DB. To keep things portable, do not build on concurrency.
我已经将 Ivo 的方法实现为上下文管理器,对于任何感兴趣的人:
I've implemented Ivo's approach as a context manager, for anyone interested:
根据最上面的答案,搁置多个作家是不安全的。 我使货架更安全的方法是编写一个包装器来负责打开和访问货架元素。 包装器代码如下所示:
As per the top answer, it's not safe to have multiple writers to the shelve. My approach to making shelves safer is to write a wrapper that takes care of opening and accessing shelve elements. The wrapper code looks something like this:
基于 Ivo 的 和 Samus_ 的< /a> 方法,我为 shelve.open 实现了一个更简单的包装器:
这避免了必须检查 dict 自上次以来是否已更改,就像 Samus_ 的 cas() 方法一样。
请注意,这将阻塞,直到获得锁为止。 如果您想在已获取锁定的情况下引发异常,请使用lockfile_lock_mode | fcntl.LOCK_NB 作为锁定标志。
它的使用方式与通常使用架子的方式相同。 例如:
将输出(假设 test_database.db 已经存在):
Building on Ivo's and Samus_'s approaches, I've implemented an even simpler wrapper for shelve.open:
This avoids having to check if the dict has changed since the last time, like in Samus_'s
cas()
method.Note that this will block until the lock can be obtained. If you instead want to throw an exception if the lock is already taken, use
lockfile_lock_mode | fcntl.LOCK_NB
as the lock flag.It can be used in the same way shelve would normally be used. For example:
will output (assuming
test_database.db
already exists):