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

标签 python multithreading process scope

那么为什么在下面的示例中永远不会打印“YES”?我需要访问self.stuffone()来自类(class)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

如果我不将 one() 作为进程启动,则输出将如我所期望的那样:

ooo = one()
ooo.start()

Process Loop
Thread Loop
{'hi': 1}
Process Loop
YES
{'hi': 1}
Process Loop
YES
{'hi': 1}
Process Loop

最佳答案

当您创建 one 实例时,它是在主进程中创建的。这意味着在主进程中,two 实例已经创建,并且它的 doit 线程已经启动。

当您在子进程中运行 ooo.start 时,它不再有权访问原始 two 实例,反之亦然 - 新进程拥有每个实例的副本实例,但子进程中的 two 实例没有执行任何操作,主进程中的 one 实例也没有执行任何操作。

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

关于python - 线程和进程之间的范围问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48511429/

相关文章:

python - python/matplotlib 中带有垂直标签的条形图

python - 这两行如何工作 x2 = x+delta[i][0] , y2 = y+delta[i][1]?

java - 如何检查其中一个线程是否失败?

c++ - 无需 fork/exec、popen() 和 system() 即可获取 linux 信息

c# - WaitForExit 用于远程计算机上的进程

c++ - 编写并执行创建无限数量进程的 C 或 C++ 程序。

python - 如果我尝试拟合 pandas 数据框中的数据,如何将 input_shape 提供给卷积神经网络?

python - 如何获取列表的最后一个元素?

java - 在特定示例的 Java 说明之前发生关系

iOS CoreData后台线程在cellForRowAtIndexPath中获取