2012-04-09 16 views
0

访问我有一个数据结构是这样的:同时,网络到Python的列表

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

这样做的规模将只有像100个键和每个键100名列表。

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

如何以安全的方式做到这一点,而无需编写太多的代码?

我想在SQLite中存储pickled对象是一个可能的解决方案。

有没有更好的方法?

+0

您可能能够使用队列,因为它们是线程安全的。这[相关答案](http://stackoverflow.com/questions/6319207/are-lists-thread-safe)可能会有所帮助。 – 2012-04-09 16:11:57

+0

因此,在能够检索列表之前,进程应该等待其他进程处理相同的数据? – 2012-04-09 16:14:52

+0

@bukzor:我认为你的编辑改变了意思。 OP建议将腌制列表存储在SQLite数据库中。而且,OP从不要求网络访问。 – 2012-04-09 16:17:09

回答

0

答案取决于瓶颈在哪里。如果你的进程是I/O绑定的(即它不会消耗大量的CPU时间来处理所有的请求),你应该看看一个事件驱动的框架,如Twisted。在这种情况下,您可以将数据存储在正常字典中,因为只有一个线程会在给定时间访问它。

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

+0

我相信(他提到“流量不是很高”),OP的应用非常简单和低负载。您能想到的最简单的解决方案将是最合适的。 – bukzor 2012-04-09 16:31:52

0

Python酱菜不是用于并发访问的。如果你可以创建一个单一的长寿命进程,你可以简单地使用一个内存结构进行操作,并使用一个pickle文件进行持久化。你需要确保你捕获信号以确保pickle文件被写入!

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

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

+0

OP想要并发写入,可以sqlite3履行这? – okm 2012-04-09 16:23:28

+0

okm:请阅读。到sqlite FAQ的链接解决您的问题。答案只是“是”。 – bukzor 2012-04-09 16:26:00

+0

是的,在这个单词后面也跟着一行代码:“当任何进程想要写入时,它必须在整个数据库文件更新期间锁定整个数据库文件。” SQLite的内存很酷,但我更喜欢你提到的这种任务的内存结构 – okm 2012-04-09 16:29:22