2016-03-01 111 views
2

如何創建可以由工作進程修改的類的python共享對象。我使用multiprocessing.Process模塊​​創建了工作進程。我有一些關於multiprocessing.manager模塊的知識。任何人都可以用示例來解釋如何將我的課程註冊到管理器中,啓動管理器並創建我的課程的共享對象。python使用多處理模塊創建的進程之間的對象共享

回答

2

下面是一個例子:

from multiprocessing import Process, Pool 
from multiprocessing.managers import BaseManager 


class MySharedClass(object): 
    stored_value = 0 
    def get(self): 
     return self.stored_value 

    def set(self, new_value): 
     self.stored_value = new_value 
     return self.stored_value 


class MyManager(BaseManager): 
    pass 


MyManager.register('MySharedClass', MySharedClass) 

def worker (proxy_object, i): 
    proxy_object.set(proxy_object.get() + i) 
    print ("id %d, sum %d" %(i, proxy_object.get())) 
    return proxy_object 


if __name__ == '__main__': 
    manager = MyManager() 
    manager.start() 
    shared = manager.MySharedClass() 

    pool = Pool(5) 
    for i in range(33): 
     pool.apply(func=worker, args=(shared, i)) 
    pool.close() 
    pool.join() 
    print "result: %d" % shared.get() 

ID 0,0總和
ID 1,總和1個
ID 2,總和3
...
ID 31,總和496
ID 32,總和528
結果:528

另一個變種(從未在真實中使用它項目):

from multiprocessing import Process, Pool 
from multiprocessing.managers import BaseManager, NamespaceProxy 


class MySharedClass(object): 
    def __init__(self): 
     self.stored_value = 0 

    def get(self): 
     return self.stored_value 

    def set(self, new_value): 
     self.stored_value = new_value 
     return self.stored_value 


class MyManager(BaseManager): 
    pass 

class MyProxy(NamespaceProxy): 
    _exposed_ = ('__getattribute__', '__setattr__', '__delattr__')# add 'get' to use get 


    #def get(self): 
    # callmethod = object.__getattribute__(self, '_callmethod') 
    # return callmethod('get') 

MyManager.register('MySharedClass', MySharedClass, MyProxy) 

def worker (proxy_object, i): 
    proxy_object.stored_value = proxy_object.stored_value + i 
    print ("id %d, sum %d" %(i, proxy_object.stored_value)) 
    return proxy_object 


if __name__ == '__main__': 
    manager = MyManager() 
    manager.start() 
    shared = manager.MySharedClass() 
    print shared.stored_value 

    pool = Pool(5) 
    for i in range(33): 
     pool.apply(func=worker, args=(shared, i)) 
    pool.close() 
    pool.join() 
    print "result: %d" % shared.stored_value 
+1

如果我把高清__init __(個體經營)方法,並把self.stored_value = 0,並試圖訪問該變量一樣proxy_object.stored_value + = 1,爲什麼這是給錯誤:AttributeError的: 'AutoProxy [MySharedClass]'對象沒有'stored_value'屬性。 我的觀點是如果我使用多處理Value()或Manager()類創建相同的變量並共享它;那麼我們可以使用對象引用操作符(。)來訪問。我想在工作進程中使用對象引用操作符 –

+0

來訪問MySharedClass()的對象變量。使用@property和<>。setter裝飾器會很好。但我發現只有一種方法,並從未使用過。它是NamespaceProxy。不知道會出現什麼樣的問題。看看更新的答案。 – minskster

+0

在上面的解決方案中,如果我導入'import eventlet'並調用'eventlet.monkey_patch()'它會給出錯誤: IOError:[Errno 11]資源暫時不可用 –

相關問題