Python:多个进程同时写入“shelve”时需要注意什么?
我在做一个Python应用的时候,想用shelve这个标准库里的功能。我的应用会有成百上千个进程,每个进程都会往同一个shelve对象里写东西。写入的内容总是添加一个新的键值对,键是唯一的,所以不会有两个进程同时更新同一条记录。
在这种情况下,可能会出现什么问题呢?
2 个回答
0
在你的情况下,使用一个更强大的键值对存储(kvp store)可能会更好,比如说redis。设置一个本地的redis服务或者远程的redis服务(比如在AWS的ElastiCache服务上)都挺简单的。
6
shelve模块的文档对此有明确说明。
shelve模块不支持同时对存储对象进行读写操作。(多个程序同时读取是安全的。)当一个程序正在写入时,其他程序不应该同时打开这个存储进行读取或写入。可以使用Unix文件锁来解决这个问题,但不同的Unix版本之间有所不同,并且需要了解所用数据库的实现。
所以,如果没有进程同步,我建议不要这么做。
这些进程是怎么启动的?如果是由一个主进程创建的,那么你可以看看multiprocessing模块。可以使用一个队列,让子进程把结果写回去,然后主进程从队列中取出这些结果并写入存储。类似的例子可以在这个链接找到。
如果你没有进程层级结构,那么你需要使用锁来控制对存储文件的读和写访问。如果你使用的是Linux或类似系统,可以考虑使用posix_ipc命名信号量。
另一个明显的选择是使用数据库服务器,比如Postgresql或类似的。