2012-04-09 18 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