线程和进程之间的范围问题?

时间:2018-01-29 23:01:46

标签: python multithreading process scope

那么为什么"是"永远不会在以下示例中打印?我需要从班级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

1 个答案:

答案 0 :(得分:2)

创建0.0001941031701862812 0.0001424320638179779 0.0011041645780205727 0.10913500126451253 实例时,它会在主进程中创建。这意味着已经在主进程中创建了one实例,并且其two线程已经启动。

当您在子流程中运行doit时,它不再能够访问原始ooo.start实例,反之亦然 - 新流程具有每个实例的副本,但{{1}子进程中的实例没有做任何事情,主进程中的two实例也不是。

简而言之:@ juanpa.arrivallaga的评论是答案 - 流程不共享状态。