2011-09-25 78 views
6

總之麻煩,說我有以下幾點:Python類繼承多,與訪問類成員

import multiprocessing 

class Worker(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     print "Init" 
     self.value = None 

    def run(self): 
     print "Running" 
     self.value = 1 

p = Worker() 
p.start() 
p.join() 
print p.value 

我期望的輸出是:

Init 
Running 
1 

相反,它是

Init 
Running 
None 

有人可以向我解釋爲什麼會出現這種情況嗎?我不理解什麼,我該如何正確地做這件事?

謝謝。

回答

9

你說p.start()的那一刻,一個單獨的進程被分離出主進程。所有變量值都被複制。所以主進程有一個p的副本,而分叉進程有一個p的單獨副本。 Worker修改了分叉進程的副本p.value,但主進程的p.value仍爲None

在進程之間共享對象的方法很多。在這種情況下,也許最簡單的方法是使用mp.Value

import multiprocessing as mp 

class Worker(mp.Process): 
    def __init__(self): 
     print "Init" 
     mp.Process.__init__(self) 
     self.num = mp.Value('d', 0.0) 

    def run(self): 
     print "Running" 
     self.num.value = 1 

p = Worker() 
p.start() 
p.join() 
print p.num.value 

注意,mp.Value0.0默認值。它不能設置爲None

+0

謝謝。它也似乎在構造函數中創建num值(而不是在main中構造它並傳遞它)也可以正常工作。我會留下一小段時間不接受的答案(正如我聽說過的習慣一樣)。 – swalog

+0

@EXIT_FAILURE:是的,謝謝。這有點更好。 – unutbu