Python 序列化对象可以由不同的进程同时访问吗?如果可以,它们的行为如何?
我的数据最好用树来表示。序列化结构最有意义,因为我不想每次都对它进行排序,它允许我对数据进行持久修改 另一方面,这棵树将从不同机器上的不同进程访问,因此我担心读写的细节。在这个主题上,基本的搜索并没有产生太多的效果Python 序列化对象可以由不同的进程同时访问吗?如果可以,它们的行为如何?,python,serialization,pickle,shelve,Python,Serialization,Pickle,Shelve,我的数据最好用树来表示。序列化结构最有意义,因为我不想每次都对它进行排序,它允许我对数据进行持久修改 另一方面,这棵树将从不同机器上的不同进程访问,因此我担心读写的细节。在这个主题上,基本的搜索并没有产生太多的效果 如果两个用户同时尝试恢复树并从中读取,他们可以同时得到服务吗,还是先任意选择一个 如果两个用户打开了树(假设他们可以),其中一个用户进行了编辑,那么另一个用户是否看到了实现的更改?(我认为他们没有,因为他们每人都收到了相当于原始数据副本的内容。) 如果两个用户同时更改对象并关闭它,那
我正在考虑对树应用一个更改队列,然后让树按照提交的顺序执行这些更改。我想在尝试解决任何问题之前,我会先问一下我的问题是什么。如果不尝试,我很确定答案是:
就个人而言,在这一点上,您可能需要考虑使用一个简单的键值存储,比如带有某种乐观锁定的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
: