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

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

我定义了一个class节点,它定义了一个监听器服务来不断地通信和更新局部变量。侦听器使用多处理启动。 class 看起来像:

# 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
        

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

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

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

除非您使用任何机制与 parent 通信,否则您将无法做到这一点。我推荐你使用 Manager dicts。

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
***********
....