那么为什么"是"永远不会在以下示例中打印?我需要从班级self.stuff
访问班级one()
的{{1}},但是two()
班self.one.stuff
总是打印一个空字典,即使我添加了它班two()
。
one()
这导致
import threading
import time
from multiprocessing import Process
class one():
def __init__(self):
self.stuff = {}
self.two = two(self)
def start(self):
while True:
print "Process Loop"
time.sleep(2)
self.stuff['hi'] = 1
print self.stuff
class two():
def __init__(self, o):
self.one = o
self.thread = threading.Thread(target=self.doit, args=())
self.thread.setDaemon(True)
self.thread.start()
def doit(self):
print "Thread Loop"
while True:
if 'hi' in self.one.stuff:
print "YES"
time.sleep(3)
ooo = one()
p = Process(target=ooo.start)
p.start()
如果我不将一个()作为一个过程启动,那么输出就像我预期的那样:
Thread Loop
Process Loop
{'hi': 1}
Process Loop
{'hi': 1}
Process Loop
{'hi': 1}
Process Loop
{'hi': 1}
Process Loop
答案 0 :(得分:2)
创建0.0001941031701862812
0.0001424320638179779
0.0011041645780205727
0.10913500126451253
实例时,它会在主进程中创建。这意味着已经在主进程中创建了one
实例,并且其two
线程已经启动。
当您在子流程中运行doit
时,它不再能够访问原始ooo.start
实例,反之亦然 - 新流程具有每个实例的副本,但{{1}子进程中的实例没有做任何事情,主进程中的two
实例也不是。
简而言之:@ juanpa.arrivallaga的评论是答案 - 流程不共享状态。