【问题标题】:Python: What to worry about when mutliple processes are concurrently writing to "shelve"?Python:当多个进程同时写入“搁置”时需要担心什么?
【发布时间】:2014-08-16 08:56:09
【问题描述】:

对于我的python 应用程序,我正在考虑使用shelve,它是标准库的一部分。将有数百个进程,每个进程都向同一个搁置对象写入内容。写作将永远是添加一个新的键值对到搁置。键是唯一的,因此没有两个进程会更新同一个条目。

在这种情况下会出现什么问题?

【问题讨论】:

  • 如果您担心它,请使用一个所有线程都写入的队列,然后让一个线程从队列中读取并写入架子。您可能想澄清您使用的是线程还是子进程。
  • @mhawke:我实际上使用的是进程(并行作业)而不是线程。但是很好,问题的原始版本使用了这两个词。我编辑来解决这个问题。谢谢。

标签: python concurrency shelve


【解决方案1】:

shelve documentation 明确说明了这一点。

搁置模块不支持并发读/写访问 搁置的物品。 (多个同时读取访问是安全的。)当 一个程序有一个可以写的架子,其他程序不应该有 它开放阅读或写作。 Unix文件锁定可以用来解决 这个,但是这在 Unix 版本之间有所不同并且需要知识 关于使用的数据库实现。

所以,如果没有进程同步,我不会这样做。

流程是如何开始的?如果它们是由主进程创建的,那么您可以查看 multiprocessing 模块。使用Queue 子进程写回他们的结果,并让主进程从队列中删除项目并将它们写入架子。此类示例位于https://stackoverflow.com/a/24501437/21945

如果您没有进程层次结构,那么您将需要使用锁定来控制对货架文件的读取访问权限。如果您使用的是 Linux 或类似软件,您可以使用 posix_ipc 命名信号量。

另一个明显的选择是使用数据库服务器 - Postgresql 或类似的。

【讨论】:

  • “多个同时读取访问是安全的”。您能否添加有关在(不同密钥的)写入期间进行多次读取访问的安全性的信息?
【解决方案2】:

在您的情况下,使用更强大的 kvp 存储(例如 redis)可能会更好。设置本地 redis 服务或远程 redis 服务(例如在 AWS 的 ElastiCache 服务上)非常容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2020-02-21
    • 2023-04-11
    • 1970-01-01
    • 2010-11-04
    • 2010-10-07
    • 2011-01-13
    相关资源
    最近更新 更多