2
如何創建可以由工作進程修改的類的python共享對象。我使用multiprocessing.Process模塊創建了工作進程。我有一些關於multiprocessing.manager模塊的知識。任何人都可以用示例來解釋如何將我的課程註冊到管理器中,啓動管理器並創建我的課程的共享對象。python使用多處理模塊創建的進程之間的對象共享
如何創建可以由工作進程修改的類的python共享對象。我使用multiprocessing.Process模塊創建了工作進程。我有一些關於multiprocessing.manager模塊的知識。任何人都可以用示例來解釋如何將我的課程註冊到管理器中,啓動管理器並創建我的課程的共享對象。python使用多處理模塊創建的進程之間的對象共享
下面是一個例子:
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
如果我把高清__init __(個體經營)方法,並把self.stored_value = 0,並試圖訪問該變量一樣proxy_object.stored_value + = 1,爲什麼這是給錯誤:AttributeError的: 'AutoProxy [MySharedClass]'對象沒有'stored_value'屬性。 我的觀點是如果我使用多處理Value()或Manager()類創建相同的變量並共享它;那麼我們可以使用對象引用操作符(。)來訪問。我想在工作進程中使用對象引用操作符 –
來訪問MySharedClass()的對象變量。使用@property和<>。setter裝飾器會很好。但我發現只有一種方法,並從未使用過。它是NamespaceProxy。不知道會出現什麼樣的問題。看看更新的答案。 – minskster
在上面的解決方案中,如果我導入'import eventlet'並調用'eventlet.monkey_patch()'它會給出錯誤: IOError:[Errno 11]資源暫時不可用 –