2014-11-24 40 views
0

我正在嘗試使用processing.Manager在進程(processing.Manager.list,processing.Manager.dict,...)之間共享數據。但是,當我使用它,對象是重複的:使用processing.Manager時對象是否重複?

from multiprocessing import Process, Manager 


def manipulate_in_process(objects): 
    objs = [] 
    for obj in objects: 
     objs.append(obj) 
    print('foo objs', objs) 

def do_in_process(objects): 
    print('objects', objects) 
    manipulate_in_process(objects) 

if __name__ == '__main__': 
    manager = Manager() 
    objects = [object(), object()] 
    print('main objects', objects) 
    shared_objects = manager.list(objects) 
    process = Process(target=do_in_process, args=(shared_objects,)) 
    process.start() 
    process.join() 
    print('finish') 

輸出:使用時

main objects [<object object at 0xb72a64a8>, <object object at 0xb72a64b0>] 
objects [<object object at 0xb72a64a8>, <object object at 0xb72a64b0>] 
foo objs [<object object at 0xb72a64e8>, <object object at 0xb72a64c0>] 
finish 

Shareds對象是重複的:0xb72a64a8 = 0xb72a64e8

  1. 我做錯了嗎?
  2. 爲什麼這些對象是重複的?
  3. 如何使用processing.Manager.list/dict/etc的對象?
+0

這聽起來像一個[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你究竟想在這裏做什麼?你顯然不只是共享對象來打印他們的ID。無論你想做什麼都可能是可行的,或者甚至是容易的,但是如果不知道它是什麼,就很難猜測。 – abarnert 2014-11-24 21:33:34

回答

0

對象在進程之間被複制而不是共享是非常固有的。這就是獨立進程的定義:它們將單獨的堆與單獨的對象分開。

如果你想實際的共享數據,你必須使用ValueArray,或sharedctypes - 但當然在這種情況下,你只限於「原生」的價值觀和你可以在C結構方面的表達。即使如此,也不能保證所有流程的id都是一樣的,只是價值本身就是這樣。

Manager的要點是您可以在服務器進程中放置一個對象,例如list,並在每個子進程中爲該對象指定一個代理。就核心列表功能而言,列表代理看起來像真正的列表(迭代,索引,append,insertindex等)。但代理並不試圖僞造「底層」內省功能,如id

Python16版本可以由Manager開箱即用代理的類型的確切列表不同,但您可以在它們的文檔中找到它。如爲3.4,它包括listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValueArray。無論如何,它永遠不會包括object,因爲object沒有功能超出了內部的東西。

當然,您可以使用自定義代理將Manager註冊爲您自己的類型。但我不確定你想要與object分享。

請參閱Sharing state between processes的概述和Managers的全部細節。