[英]Python Objects in Multiprocessing
我正在用一個簡單的程序測試python多處理:
class MyTest:
def __init__(self):
self.myattr = 1
def myfunc(self):
print(self)
self.myattr=2
print(self)
print("in proc"+str(self.myattr))
def main():
test = MyTest()
print(test)
myProc = Process(target = test.myfunc,args=())
myProc.start()
myProc.join()
print(test.myattr)
main()
進程正在運行的方法中self的輸出與main中的對象的地址相同,我發現這很奇怪,因為它們是獨立的進程。 但是,由於它們位於同一地址,因此實際上它們在進程之間共享,並且更新myfunc中的屬性myattr應該會更改main中的測試屬性。 但是,即使進程完成更新test
的屬性后, print(test.myattr)
仍會打印1。
我的第一個問題是為什么這兩個對象在單獨的進程中共享相同的地址,而我的第二個問題是,如果它們確實共享相同的地址,為什么一個進程中的更改不會被另一個進程的更改所識別?
PS:我的第一個問題是否與我向進程傳遞一個對象方法作為目標運行的事實有關? 即對象函數調用,例如test.myfunc = MyTest.myfunc(test)。
輸出:
<__main__.MyTest object at 0x7f007bdf76d8>
<__main__.MyTest object at 0x7f007bdf76d8>
<__main__.MyTest object at 0x7f007bdf76d8>
in proc2
1
我認為您應該使用pathos
,它簡化了類的多重處理,並且像輕輕松松地工作。
第1步:
pip install pathos
第2步:
重構代碼使其能夠在沒有__init__()
情況下運行,然后擁有一個可以運行您要運行的類的方法,實例變量應位於您要運行的類方法中。
第三步:
然后根據需要運行它。
例:
from pathos.multiprocessing import ProcessingPool as Pool
p = Pool(4)
class MyClass:
def add(self, x, y):
return x+y
mc = MyClass()
x = [1,2,3,4,5]
y = [0,2,4,6,8]
result = p.amap(mc.add, x, y)
print result.get()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.