并发,联网访问python列表

时间:2012-04-09 16:09:38

标签: python

我有这样的数据结构:

{
    'key1':[
        [1,1,'Some text'],
        [2,0,''],
        ...
    ],
    ...
    'key99':[
        [1,1,'Some text'],
        [2,1,'More text'],
        ...
    ],
}

每个键的大小只有100个键和100个列表。

我喜欢存储它并根据键检索它(整个列表)。这适用于流量不是很高的Web服务器。但是,后端必须处理并发读写。

如何以安全的方式执行此操作,而无需编写太多代码?

我认为在SQLite中存储pickled对象是一种可能的解决方案。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

答案取决于瓶颈在哪里。如果您的进程受I / O限制(即它不会占用处理所有请求的大量CPU时间),那么您应该查看像Twisted这样的事件驱动框架。在这种情况下,您可以将数据存储在普通字典中,因为在给定时间只有一个线程可以访问它。

如果您的进程是CPU密集型的并且您想要利用多个内核,则需要使用多个Python进程,因为每个Python进程都将保存一个GIL(全局解释器锁),并且多个线程无法执行Python代码同一个过程同时进行。在这种情况下,一个非常简单的选择是使用共享存储,例如memcached

答案 1 :(得分:0)

Python pickles不是为并发访问而创建的。如果您可以创建一个长期存在的进程,则可以简单地使用内存结构进行操作,并使用单个pickle文件来保持持久性。您需要确保捕获信号以确保写入pickle文件!

更灵活的解决方案是sqlite。 sqlite网页brags:“我们知道没有其他嵌入式SQL数据库引擎支持与SQLite一样多的并发性。”这里的问题是你很可能错误地设置了数据库设计(没有违法行为)。我会创建一个“键”表和一个“列表”表(建议使用更有意义的名称!),外键从列表指向键。确保键有索引!

如果列表不是固定长度,则应创建第三个表来保存这些值,外键指向列表。