2017-07-25 91 views
3

我試圖改變一個類字段使用它的方法,但是當方法放入它不起作用。Python多處理類方法

從多進口過程

class Multi: 
    def __init__(self): 
     self.x = 20 


    def loop(self,): 
     for i in range(1,100): 
      self.x = i 

M = Multi() 

p = Process(target=M.loop) 
p.start() 

運行此程序M.x仍然是20後這怎麼可能?

+1

您確定在進程完成後檢查值*嗎? – MLavrentyev

回答

1

這個問題很可能是由於當您檢查M.x的值時,之前循環實際運行(由於多處理的並行性)。嘗試在loop()之內和p.start()之後打印出一條打印聲明,打印出M.x。看哪一個先打印。這可能是M.x之一。

+0

我無時無刻都在檢查。 – Barty

+0

你確定在'p.start()'之後你正在打印的東西正在*循環中的所有內容之後進行打印嗎? – MLavrentyev

+0

即使當我把打印內M.loop它不打印任何東西。 – Barty

0
from multiprocessing import Process 

class Multi: 
    def __init__(self): 
     self.x = 20 


    def loop(self): 
     for i in range(1,100): 
      self.x = i 
     print self.x 


M = Multi() 

p = Process(target=M.loop, args =()) 
p.start() 

這裏是循環方法中的print語句的代碼。

+0

* *真的應該打印99.我可以看到這種代碼的多種變體可能會打印其他東西,但* this * print肯定是在循環之後,並且肯定使用了工作進程版本的'x'實例變量。 – user2357112

+0

當我[嘗試](http://ideone.com/cAWKXN),我看到99. – user2357112

+0

(因爲你的文章沒有回答這個問題,所以不應該發佈爲答案,而是編輯信息進入你的問題。) – user2357112

3

首先,您想要使用join,它會在繼續完成其餘代碼之前等待該過程完成。

其次,當您使用multiprocess時,它會爲每個Process創建一個新實例M。內loop

class Multi: 
    def __init__(self): 
     self.x = 20 

    def loop(self): 
     print(self, 'loop') 
     for i in range(1, 100): 
      self.x = i 


if __name__ == '__main__': 
    M = Multi() 
    print(M, 'main 1') 
    p = Process(target=M.loop) 
    p.start() 
    p.join() 
    print(M, 'main 2') 

>>> <__main__.Multi object at 0x000001E19015CCC0> main 1 
>>> <__mp_main__.Multi object at 0x00000246B3614E10> loop 
>>> <__main__.Multi object at 0x000001E19015CCC0> main 2 

正因爲如此打印self時,你可以看到這一點,x值在原來的類是永遠不會更新。

幸運的是,您可以使用Value對象來處理這個問題。這創建了一個共享內存對象,可以通過這些進程修改

from multiprocessing import Process, Value 


class Multi: 
    def __init__(self): 
     self.x = Value('i', 20) 

    def loop(self): 
     for i in range(1, 100): 
      self.x.value = i 


if __name__ == '__main__': 
    M = Multi() 
    p = Process(target=M.loop) 
    p.start() 
    p.join() 

    print(int(M.x.value)) 
    >> 99 
+0

非常感謝你:)。 – Barty