在父进程中,如何查看由子进程管理的子变量?

In a parent process, how to see child variables that are managed by child processes?

提问人:xc wang 提问时间:11/20/2020 最后编辑:Jonathan Lefflerxc wang 更新时间:11/20/2020 访问量:485

问:

我定义了一个类 Node,它定义了一个侦听器服务来不断通信和更新局部变量。侦听器使用多处理启动。该类如下所示:

# Pseudo-code
import multiprocessing
class Node(object):
    def __init__(self, x):
        self.variables = x
    def listener(self):
        while(True):
            COMMUNICATE WITH OTHERS     # Pseudo-code
            UPDATE self.variable        # Pseudo-code
            print(self.variable)        # local printer
    def run(self):
        p = multiprocessing.Process(target=self.listener)
        p.start()

在主进程中,我创建了两个节点 a = Node(x1), b = Node(x2),并让它们运行

if __name__ == "__main__":
    x1 = 1       # for example
    x2 = 1000    # for example
    a = Node(x1)
    b = Node(x2)

    a.run()
    b.run()

    while(True):
        print(a.variable)        # global printer
        print(b.variable)        # global printer
        

这样,节点 a 与节点 b 通信并更新其变量,节点 b 也是如此。

现在我遇到了一个问题:本地打印机可以正确输出更新的变量值,但全局打印机不能。实际上,全局打印机始终输出不变的值(x1、x2,与初始值相同)。

代码有什么问题 或者如何查看子进程变量?

Python 多处理 子进程

评论

0赞 Jonathan Leffler 11/20/2020
出于大多数实际目的,除非使用调试器或将变量放在共享内存中,否则无法查看其他进程中的变量(然后确保没有来自不同进程的并发访问)。或者,它做不到。

答:

1赞 Guillem 11/20/2020 #1

除非您使用任何机制与父母沟通,否则您将无法做到这一点。我建议你使用管理器字典。

import random
import time
import multiprocessing as mp


class Child(mp.Process):

    def __init__(self, shared_variables):
        super(Child, self).__init__()
        self.shared_variables = shared_variables

    def run(self):
        for _ in range(5): # Change shared variable value 5 times
            self.shared_variables['var'] = random.randint(0, 10)
            self.shared_variables['var1'] = random.randint(0, 10)
            time.sleep(3)


if __name__ == "__main__":
    shared_variables = mp.Manager().dict()
    child = Child(shared_variables)
    child.start()

    while True:
        print('Form parent')
        for k, v in shared_variables.items():
            print(f'-> {k}: {v}')
        print('***********')
        time.sleep(3)

输出如下所示:

Form parent
-> var: 8
-> var1: 6
***********
Form parent
-> var: 7
-> var1: 7
***********
....