2012-01-28 61 views
1

在蟒蛇多模塊,以便從遠程管理器獲得一個對象,大多數的食譜告訴我們,我們需要建立一個getter恢復的每個對象:如何知道python多進程管理器共享什麼對象?

class QueueMgr(multiprocessing.managers.SyncManager): pass 
datos=Queue() 
resultados=Queue() 
topList=list(top) 
QueueMgr.register('get_datos',callable=lambda:datos) 
QueueMgr.register('get_resultados',callable=lambda:resultados) 
QueueMgr.register('get_top',callable=lambda:topList) 
def Cola_run(): 
    queueMgr=QueueMgr(address=('172.2.0.1', 25555),authkey="foo") 
    queueMgr.get_server().serve_forever() 
Cola=Thread(target=Cola_run) 
Cola.daemon=True 
Cola.start() 

,比相同的獲取必須聲明客戶端程序:

class QueueMgr(multiprocessing.managers.SyncManager): pass 
QueueMgr.register('get_datos') 
QueueMgr.register('get_resultados') 
QueueMgr.register('get_top') 
queueMgr=QueueMgr(address=('172.22.0.4', 25555),authkey="foo") 
queueMgr.connect() 
datos=queueMgr.get_datos() 
resultados=queueMgr.get_resultados() 
top=queueMgr.get_top()._getvalue() 

好的,它涵蓋了大多數的使用情況。但我覺得代碼看起來很難看。也許我沒有得到正確的配方。但是如果真的如此,那麼至少我可以在客戶端中做一些更好的代碼,如果能夠事先知道Manager共享的對象,可能會自動聲明獲取者。他們是否有辦法做到這一點?

如果您認爲由multiprocessing.Manager()提供的SyncManager實例允許創建複雜的代理對象,但連接到此類SyncManager的任何客戶端似乎都需要從其他位置獲取對此類代理的引用,這一點尤其令人不安。

回答

1

沒有什麼能夠阻止你從內省進入這個類,並且對於每個共享屬性來說,生成吸氣者並調用register

+0

我明白了。是否有一些標準配方?儘管如此,我還不確定它是否也適用於由multiprocessing.Manager()生成的實例,對嗎? – arivero 2012-01-28 22:24:15

+0

arivero:您可以使用Python元類。 – Borealid 2012-01-28 23:14:01

相關問題