python进程创建类的相同实例

python进程创建类的相同实例,python,python-multiprocessing,Python,Python 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):

我有一个使用
多处理库的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\u foobar()
如何向每个进程返回相同的
Foo
实例

编辑/更新:
我在OSX和Ubuntu上用Python3.5运行它

基本上你的答案是:

最相关的报价是:

对象的id只保证在该对象的生命周期内是唯一的,而不是在程序的整个生命周期内

您的第一个
Foo()
实例似乎在创建第二个实例之前就已经“死亡”,因此它们可能最终获得相同的ID

没有多重处理也会发生同样的事情:

>>> def run():
...     my_foo = get_foobar()
...     print('got foo {}'.format(id(my_foo))) ... 
>>> run() 
got foo 140690243732040
>>> run() 
got foo 140690243732040
编辑:这是来自:

返回对象的“标识”。这是一个整数,它是 保证此对象在运行期间唯一且恒定 一生寿命不重叠的两个对象可能具有相同的 id()值


在此上下文中,对象仅在特定范围内存在(即
运行
函数)可能意味着它们的生存期不同。这与python 2文档没有什么不同,但我猜实现是不同的,因此可以解释结果。

我运行了代码,得到了不同的实例,您使用的是什么操作系统?我也运行了代码,得到了相同的实例,如问题中所述,ubuntuin python 2.7上的python3它给出了不同的实例,在3.5版本中,同样的idseem是python 3吗?这是故意的吗?如果是,为什么?我更新了我原来的帖子。我感兴趣的是,当两个进程都在运行时,id是相同的(存在一个睡眠,因此对象不会被破坏),但是,属性可以不同,这表明它们实际上是同一类的不同实例。我看到了您的编辑
get\u foobar
与此无关,如果您直接通过
my\u foo=foo()
执行此操作,也会发生同样的情况。此外,我再次编辑了我的答案,添加了一些新的想法