2017-07-07 98 views
0

的同一個實例我有使用multiprocessing庫,我遇到,我希望不同的流程,創建一個類的不同實例,一個問題一個Python應用程序,但是,他們實際上是在創建相同的實例的類。就拿這個例子:蟒蛇過程產生

from multiprocessing import Process 
from time import sleep 


class Foo: 
    name = None 


def get_foobar(): 
    return Foo() 


class MyProcess(Process): 
    def run(self): 
     print('process {} running in pid {}'.format(self.name, self.pid)) 
     my_foo = get_foobar() 
     print('got foo {}'.format(id(my_foo))) 

     if my_foo.name is None: 
      my_foo.name = self.name.upper() 

     print("foo's name is {}".format(my_foo.name)) 

     # do some work 
     sleep(3) 

     print('process {} running in pid {} done'.format(self.name, self.pid)) 


for _ in range(2): 
    p = MyProcess() 
    p.start() 

我得到以下輸出:

process MyProcess-1 running in pid 65975 
got foo 4322815784 
foo's name is MYPROCESS-1 
process MyProcess-2 running in pid 65976 
got foo 4322815784 
foo's name is MYPROCESS-2 
process MyProcess-1 running in pid 65975 done 
process MyProcess-2 running in pid 65976 done 

我期待在第二過程中要有類的不同實例。 get_foobar()如何能夠將相同的Foo實例返回給每個進程?

編輯/ UPDATE: 我在OSX和Ubuntu的Python 3.5運行此。

+0

嗯,我跑的代碼,我正常 –

+0

得到不同的實例您正在使用什麼操作系統? – BrenBarn

+0

我也跑的代碼,在這個問題得到了相同的實例一樣,在Python 2.7它給不同的情況下,在Ubuntu –

回答

0

基本上你的答案就在這裏:Why is the id of a Python class not unique when called quickly?

最相關的報價是:

的對象的ID是唯一的保證是該對象的生存期間是唯一,沒有結束的整個生命週期程序。

看來,你的第一個實例Foo()只是「死」創建第二個之前,所以他們最終可能會得到相同的ID。

同樣的事情發生,而不多:

>>> def run(): 
...  my_foo = get_foobar() 
...  print('got foo {}'.format(id(my_foo))) ... 
>>> run() 
got foo 140690243732040 
>>> run() 
got foo 140690243732040 

編輯:這是從docs

返回的對象的「身份」。這是一個整數,它是 在其生命週期內保證是唯一且恆定的。 具有非重疊生命期的兩個對象可能具有相同的 id()值。

在這種情況下,物體的存在只在某些範圍內(即run函數)可能意味着它們具有不同的生命期,無論如何。這與python 2 docs沒有什麼不同,但是我的猜測是實現是不同的,所以解釋了結果。

+0

我更新了我原來的帖子。有趣的是,當兩個進程都在運行時,id是相同的(有一個睡眠,所以對象沒有被破壞),但是,屬性可能不同,這表明它們實際上是同一類的不同實例。 – user5038859

+0

我看到你的編輯...'get_foobar'無關吧,同樣的事情發生,如果你這樣做,直接通過'my_foo =美孚()' –

+0

另外,我再次編輯我的答案,增加了一些新的想法 –