可以通过不同的进程同时访问序列化对象,如果是这样,它们的行为如何?

时间:2014-02-12 01:36:33

标签: python serialization pickle shelve

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

另一方面,这棵树将从不同机器上的不同进程访问,所以我担心阅读和写作的细节。基本搜索没有对该主题产生太多影响。

  1. 如果两个用户同时尝试恢复树并从中读取,那么它们可以一次性提供,还是先任意一个?
  2. 如果两个用户打开了树(假设他们可以)并且一个人进行了编辑,那么另一个用户是否看到了实施的更改? (我假设他们没有,因为他们每人都收到了相当于原始数据的副本。)
  3. 如果两个用户同时更改了该对象并将其关闭,那么,是首先是一个,还是尝试同时进行这两个更改?
  4. 我正在考虑将更改队列应用于树,然后让树按提交顺序执行。我想在尝试解决它们之前我会问我的问题是什么。

2 个答案:

答案 0 :(得分:1)

没有尝试,我很确定答案是:

  1. 它们都可以同时提供,但是,如果一个用户正在阅读而另一个用户正在阅读,那么阅读用户可能会得到奇怪的结果。
  2. 可能不是。将树从文件读入内存后,其他用户将看不到第一个用户的编辑。如果尚未从文件中读取树,则仍将检测到更改。
  3. 两个更改都将同时进行,文件可能已损坏。
  4. 另外,你提到了搁置。从搁置文件:

      

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

    就个人而言,此时,您可能希望使用像Redis这样的简单键值存储来进行某种乐观锁定。

答案 1 :(得分:0)

您可以尝试klepto,它提供了一个sql数据库的字典界面(使用sqlalchemy下的封面)。如果您选择将数据保留到mysqlpostgresql或其他可用数据库(sqlite除外),那么您可以让两个或更多人同时访问数据或拥有两个数据线程/进程访问数据库表 - 并让数据库管理并发读写。将klepto与数据库后端一起使用将在并发访问下以及直接访问数据库时执行。如果您不想使用数据库后端,klepto也可以写入磁盘 - 但是在写入磁盘时可能会发生冲突 - 即使klepto使用“复制 - on-write,然后替换“在磁盘上处理文件时最小化并发冲突的策略。使用文件(或目录)后端时,由于策略klepto用于保存写入磁盘,因此仍然会处理问题1-2-3。此外,klepto可以使用内存缓存层来实现快速访问,其中来自磁盘(或数据库)后端的加载/转储可以按需完成,也可以在内存缓存到达用户时完成 - 确定的大小。

具体来说:(1)两者同时送达。 (2)如果一个用户进行编辑,则另一个用户看到更改 - 但是如果第二个用户正在使用内存中缓存层,则该更改可能会“延迟”。 (3)多个同时写入不是问题,因为klepto让NFS或sql数据库处理“copy-on-write,then replace”更改。

klepto.archvives的字典界面也可以在提供LRU缓存(以及LFU和其他)的装饰器表单中使用,所以如果你有一个正在生成/访问的函数数据,连接存档非常简单 - 您可以通过磁盘或数据库后端进行记忆。

使用klepto,您可以选择几种不同的序列化方法来加密数据。您可以klepto将数据转换为字符串,或使用散列算法(如md5),或使用pickler(如jsonpickle或{{1 }})。

您可以在此处dill获取https://github.com/uqfoundation/klepto