Python 序列化对象可以由不同的进程同时访问吗?如果可以,它们的行为如何?

Python 序列化对象可以由不同的进程同时访问吗?如果可以,它们的行为如何?,python,serialization,pickle,shelve,Python,Serialization,Pickle,Shelve,我的数据最好用树来表示。序列化结构最有意义,因为我不想每次都对它进行排序,它允许我对数据进行持久修改 另一方面,这棵树将从不同机器上的不同进程访问,因此我担心读写的细节。在这个主题上,基本的搜索并没有产生太多的效果 如果两个用户同时尝试恢复树并从中读取,他们可以同时得到服务吗,还是先任意选择一个 如果两个用户打开了树(假设他们可以),其中一个用户进行了编辑,那么另一个用户是否看到了实现的更改?(我认为他们没有,因为他们每人都收到了相当于原始数据副本的内容。) 如果两个用户同时更改对象并关闭它,那

我的数据最好用树来表示。序列化结构最有意义,因为我不想每次都对它进行排序,它允许我对数据进行持久修改

另一方面,这棵树将从不同机器上的不同进程访问,因此我担心读写的细节。在这个主题上,基本的搜索并没有产生太多的效果

  • 如果两个用户同时尝试恢复树并从中读取,他们可以同时得到服务吗,还是先任意选择一个
  • 如果两个用户打开了树(假设他们可以),其中一个用户进行了编辑,那么另一个用户是否看到了实现的更改?(我认为他们没有,因为他们每人都收到了相当于原始数据副本的内容。)
  • 如果两个用户同时更改对象并关闭它,那么是一个用户先更改,还是试图同时进行这两个更改

  • 我正在考虑对树应用一个更改队列,然后让树按照提交的顺序执行这些更改。我想在尝试解决任何问题之前,我会先问一下我的问题是什么。

    如果不尝试,我很确定答案是:

  • 但是,如果一个用户正在阅读,而另一个用户正在写作,那么阅读用户可能会得到奇怪的结果
  • 可能不会。一旦树从文件读入内存,其他用户将看不到第一个用户的编辑。如果尚未从文件中读取树,则仍将检测到更改
  • 这两个更改将同时进行,并且文件可能已损坏
  • 还有,你提到了谢尔夫。从搁置文档中:

    搁置模块不支持对的并发读/写访问 搁置的物品。(多个同时读取访问是安全的。)当 一个程序有一个可供编写的工具架,其他任何程序都不应该有 它对阅读或写作开放。Unix文件锁定可以用来解决 这一点很重要,但这在Unix版本中有所不同,需要了解 关于使用的数据库实现


    就个人而言,在这一点上,您可能需要考虑使用一个简单的键值存储,比如带有某种乐观锁定的Redis。

    您可以尝试使用
    klepot
    ,它为sql数据库提供了一个字典接口(在封面下使用
    sqlalchemy
    )。如果选择将数据持久化到
    mysql
    postgresql
    或其他可用数据库(除了
    sqlite
    ),则可以让两个或更多人同时访问数据,或者让两个线程/进程访问数据库表,并让数据库管理并发读写。使用带有数据库后端的
    klepot
    将在并发访问下执行,就像直接访问数据库一样。如果您不想使用数据库后端,
    klepot
    也可以写入磁盘,但在写入磁盘时可能会发生冲突,即使
    klepot
    使用“写入时复制,然后替换”策略,在处理磁盘上的文件时将并发冲突降至最低。在使用文件(或目录)后端时,由于采用了
    klepot
    将写操作保存到磁盘的策略,问题1-2-3仍然会得到处理。此外,
    klepot
    可以使用内存缓存层,该层支持快速访问,从磁盘(或数据库)后端的加载/转储可以按需完成,也可以在内存缓存达到用户确定的大小时完成

    具体来说:(1)两者同时提供。(2) 如果一个用户进行编辑,另一个用户会看到更改——但是,如果第二个用户使用内存缓存层,则该更改可能会“延迟”。(3) 多个同时写入不是问题,因为klepto让NFS或sql数据库处理“写入时复制,然后替换”更改

    klepot.archvives
    的字典接口也以装饰器形式提供,它提供了
    LRU
    缓存(以及
    LFU
    和其他),因此,如果您有一个生成/访问数据的函数,那么连接归档非常容易——您可以使用磁盘或数据库后端进行记忆

    使用
    klepot
    ,您可以从几种不同的序列化方法中进行选择以加密数据。您可以使用
    klepot
    将数据转换为字符串,或者使用散列算法(如
    md5
    ),或者使用pickler(如
    json
    pickle
    ,或者
    dill

    您可以在此处获得
    klepot