这是我学习Python的第二天,我发现这是一门非常酷的语言,我想用它尝试不同的东西。
是否有可能调用一个对象并创建该对象的方法的守护进程,这将改变对象的属性?
from multiprocessing import Process
import time
class Foo(object):
def __init__(self):
self.number = 1
# this attribute...
def loop(self):
while 1:
print self.number
# ...is changed here
self.number += 1
time.sleep(1)
if __name__ == '__main__':
f = Foo()
p = Process(target=f.loop)
p.deamon = True # this makes it work in the background
p.start()
# proceed with the main loop...
while 1:
time.sleep(1)
print f.number * 10
结果:1
10
2
10
3
10
4
10
...
为什么f.loop()
不改变f
的self.number
?它们都是同一类Foo()
的一部分。
我可以修改什么来接收这个输出:
1
10
2
20
3
30
4
40
...
/编辑1:
我尝试了这个,得到了相同的结果(为什么?):
class Foo(Process):
def __init__(self):
super(Foo, self).__init__()
self.daemon = True # is daemon
self.number = 1
self._target = self.loop # on start() it will run loop()
def loop(self):
while 1:
print self.number
self.number += 1
time.sleep(1)
if __name__ == '__main__':
f = Foo() # is now Process
f.start() # runs f.loop()
while 1:
time.sleep(1)
print f.number * 10
输出与之前相同
您正在使用multiprocessing
。简短的(稍微简化的)回答是,默认情况下进程不共享内存。试着用threading
代替。
如果你下定决心要尝试共享内存和进程,那么请查看multiprocessing文档中的共享状态。
而且daemon
并不像你想象的那样。如果一个进程创建了子进程,那么当它退出时,它将试图杀死所有的守护子进程。所有的进程都会在后台运行,你只需要启动它们。