我需要创build一个系统在linux系统上存储python数据结构,但是可以同时读写来自多个程序/守护进程/脚本的数据。 我的第一个想法是我会创build一个unix套接字,将监听连接,并提供请求的数据作为pickled python数据结构。 客户端的任何写入操作都会同步到磁盘上(也许是批量的,但我不认为它是高吞吐量,所以只要Linux vfscaching可能会好)。 这确保只有一个进程读取和写入数据。
另一个想法是只保留磁盘上的pickle数据结构,并且只允许通过锁文件或令牌访问单个进程…这要求所有访问客户端都遵守locking机制/使用访问模块。
我在看什么? SQLite是可用的,但我想保持这个尽可能简单。
你会怎么做?
如果可用,我只会使用SQLite。
看到这个常见问题: http ://www.sqlite.org/faq.html#q5 – SQLite(与pysqlite [0])应该能够优雅地处理你的并发。
你可以保持数据为简单的键值对,如果你喜欢,没有必要去你所有的数据BNF。
如果你只想存储名称/值对(例如,文件名到腌制数据),你总是可以使用Berkley DB(http://code.activestate.com/recipes/189060-using-berkeley-db-database/)。 如果你的数据是面向数字的,你可能想查看PyTables(http://www.pytables.org/moin)。 如果你真的想使用套接字(我通常会试图避免这种情况,因为有很多细节你不得不担心),你可能想看看Twisted Python(很好的处理通过Python的多个连接,不需要线程)。
我会使用一个数据库。 一个真正的。 这就是为什么他们存在(呃,其中一个原因)。 如果不必要,不要重新发明轮子。
留下后端存储(这里有很多选项,包括ConfigParser,shelf,sqlite和anydbm),使用单个进程处理存储和其他连接到存储的想法可能是可用的。 我首先想到的是Pyro (Python远程对象)。 插槽,虽然始终可用,可能会变得棘手。
您可以序列化数据结构并使用ConfigParser
将它们存储为值。 如果你创建自己的访问lib /模块来访问数据,你可以在lib中进行序列化,这样客户端代码就可以发送和接收python对象。 你也可以在lib中处理并发。