2012-07-02 49 views
10

我試圖找出一種方式來共享蟒蛇進程之間的內存。基本上存在多個python進程需要能夠讀取(只讀)和使用(沒有突變)的對象。現在這是使用redis + strings + cPickle實現的,但cPickle佔用了寶貴的CPU時間,所以我不想使用它。我在互聯網上看到的大多數python共享內存實現似乎都需要文件和菜單,這基本上是我正在做的事情,正是我想要避免的。蟒蛇進程之間的共享內存

我想知道的是,是否會有一種方法來編寫像......基本上是內存中的python對象數據庫/服務器和相應的C模塊來連接數據庫?

基本上,C模塊會要求服務器寫一個對象的地址,服務器會用地址做出響應,然後模塊會寫入對象,並通知服務器有寫入給定密鑰的對象到指定位置的磁盤。然後,當任何進程想要用一個給定的鍵檢索一個對象時,他們只需要向db提供給定鍵的內存位置,服務器就會響應該位置,模塊將知道如何在內存中加載該空間,將python對象傳回python進程。

這是完全不合理的還是真的很難實施?我追逐那些不可能的事情嗎?歡迎大家提出意見。謝謝互聯網。

+1

你的CPU時間到底有多珍貴,值得拋棄一個工作解決方案,而這個解決方案比你提出的要少得多以保持同步?你所要求的是可以做到的,但是這會讓屁股做出正確的*很大的痛苦。 – millimoose

+0

CPU時間是最寶貴的。基本上取消打擊的對象可以從20毫秒(小一點)到60毫秒(對於一個大點)。我個人覺得這兩個時間都太長了。 編輯:太長的意義上,必須有一個更好的方式,而不是我認爲cPickle沒有足夠努力。 – nickneedsaname

+0

共享內存將是可行的,但共享對象將嚴重困難...一個相關的問題可以在這裏找到:http://stackoverflow.com/questions/1268252/python-possible-to-share-in-memory-data介於兩個獨立過程之間(Alex Martelli有一個很好的解釋爲什麼這很難)。 – ChristopheD

回答

5

不無道理。

IPC可以使用內存映射文件完成。 Python已經功能內置:

http://docs.python.org/library/mmap.html

只是在mmap的兩個進程的文件,嘿,你似的有一個共享文件。當然,你必須在兩個過程中進行輪詢,看看有哪些變化。而且你必須在兩者之間進行合作。並決定要將數據放入哪種格式,但這是解決您的問題的常用方法。

+6

但是這仍然需要序列化爲字節,是嗎? OP說他試圖避免這種情況。 –

+0

這是某種序列化,是的。如果對象類型已知,自定義序列化可能會做得更好。或者,包含一個哈希碼以避免重新對一個對象進行兩次反序列化。然而,這是完成的,序列化是必需的。 – Joe

+0

沒有序列號:( – nickneedsaname

3

如果你不想酸洗,multiprocessing.sharedctypes可能適合。雖然這有點低級,您可以獲得單個值或指定類型的數組。

將數據分發到子進程的另一種方法是(單向)multiprocessing.Pipe。它可以處理Python對象,並且它用C實現,所以我不能告訴你它是否使用酸洗。