我有一个使用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中运行它。
答案 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文档没有什么不同,但我的猜测是实现方式不同以便解释结果。