我正在使用外部C庫解析來自外部源的數據和Python庫來運行一些優化問題的程序。優化是非常耗時的,因此使用多個CPU將是一個重要的優勢。涉及C對象的Python多處理共享內存問題
基本上,我裹C(++)與用Cython結構如下:
cdef class CObject(object):
cdef long p_sthg
cdef OBJECT* sthg
def __cinit__(self, sthg):
self.p_sthg = sthg
self.sthg = <OBJECT*> self.p_sthg
def __reduce__(self):
return (rebuildObject, (self.p_sthg,))
def getManyThings(self):
...
return blahblahblah
然後創建我的資源密集的過程:
p = mp.Process(target=make_process, args=((cobject,)))
正如你可以立即猜出(當然我沒有),即使我設法取消了CObject,指針卻被傳遞給新的進程,但不是它引用的C結構。
我可以找到一些資源解釋如何將Python對象放入共享內存中,但這在我的情況下還不夠,因爲我需要共享我幾乎不知道的C對象(以及其他指向的對象頂級CObject)在Python進程之間。
如果它的事項,好事是,我可以只讀訪問我們存活......
沒有人有與該事項有關的經驗嗎?
我的另一個想法是找到一種方法來編寫我需要傳遞到文件中的對象的二進制表示形式,並從另一個進程中讀取它...
我的結構並不複雜,但鏈接到其他結構的std :: list,它們本身鏈接到其他結構的std :: list(我沒有檢查遞歸級別,但沒有循環.. 。)我猜Cython並沒有被設計爲欺騙分配器(用'boost'找到的東西,但沒有更基本的東西?),並手動調整剩餘的指針......我可能有一個特定於我的需求的解決方法(通過調用數據獲取從過程和修剪什麼我需要,更安全!)但是wul仍然喜歡看到一個隱藏的std :: list測試案例通過Cython中的共享內存... –
xoolive
@xoolive:一個列表是由許多指針,最封裝。如果您嘗試分享它,那些指針將不起作用,整個事情就會炸燬。顯然[Boost可以做到這一點](http://www.boost.org/doc/libs/1_59_0/doc/html/interprocess.html),但這是一個額外的依賴項,看起來並不直接在STL上工作容器。遞歸地遍歷列表並逐個序列化其元素可能會更簡單。 – Kevin