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的任何客戶端似乎都需要從其他位置獲取對此類代理的引用,這一點尤其令人不安。
我明白了。是否有一些標準配方?儘管如此,我還不確定它是否也適用於由multiprocessing.Manager()生成的實例,對嗎? – arivero 2012-01-28 22:24:15
arivero:您可以使用Python元類。 – Borealid 2012-01-28 23:14:01