python进程创建相同的类实例

时间:2017-07-07 05:33:45

标签: python python-multiprocessing

我有一个使用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的同一个实例返回给每个进程?

编辑/更新: 我在OSX和Ubuntu的python 3.5中运行它。

1 个答案:

答案 0 :(得分:1)

基本上你的答案就在这里: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文档没有什么不同,但我的猜测是实现方式不同以便解释结果。