为什么要更改静态变量?

在python中使用静态变量时遇到一些问题。我正在尝试提供一个进程数计数器(称为 Node 的类)。在初始化中,一切都很好,但是在静态变量 num_node 之后,开始有2个不同的值。在主节点上具有正确的值,即已创建的节点数,但是如果我将其打印在Node的实例上,则会将其重置为0

(英语不是我的母语;请原谅我的任何错误)

这是我的班级节点:

class Node(Process):
    num_node = 0

    @classmethod
    def increase(cls):
        Node.num_node += 1

    @classmethod
    def get_num_node(cls):
        return Node.num_node

    def __init__(self,queue):
        super(Process,self).__init__()
        self.queue = queue
        Node.increase()
        print("Number of node in the INIT of NODE: {}".format(Node.get_num_node()))

    def run(self):
        while True:
            self.queue.get()
            print("Number of node inside the NODE: {}".format(Node.get_num_node()))

这是主要内容:

if __name__ == '__main__':
    nodes = []
    # CREATE 3 NODE
    for i in range(2):
        p = Node(Queue())
        p.start()
        nodes.append(p)
        print("Number of node inside the MAIN: ",Node.get_num_node())

    msg = input("\nInsert message> ")
    for n in nodes:
        n.queue.put((msg,0))
    time.sleep(1)
    print("Number of node inside the MAIN: ",Node.get_num_node()) 

当我运行它时,输出为:

Number of node in the INIT of NODE: 1
Number of node inside the MAIN:  1
Number of node in the INIT of NODE: 2
Number of node inside the MAIN:  2

Insert message> 0
Number of node inside the NODE: 0
Number of node inside the NODE: 0
Number of node inside the MAIN:  2

为什么会这样?

pony0517 回答:为什么要更改静态变量?

您的问题是变量不会在进程之间传递。相反,当您生成一个新进程时,它将继承创建进程时存在的所有变量,但是对这些变量的更新不会传播到已经运行的另一个进程。

更新注释中的range子句以创建三个过程后,会发生以下情况:

Number of node in the INIT of NODE: 1
Number of node inside the MAIN:  1
Number of node in the INIT of NODE: 2
Number of node inside the MAIN:  2
Number of node in the INIT of NODE: 3
Number of node inside the MAIN:  3

Insert message> 0
Number of node inside the NODE: 1
Number of node inside the NODE: 2
Number of node inside the NODE: 3
Number of node inside the MAIN:  3

您的第一个子进程以num_node为0开始,然后将其递增1。现在,该类的num_node为1。创建第二个子级时,该类以num_node为1开头,并递增1。这意味着现在您的第一个进程的num_node为1,第二个进程的为2。依此类推。

您可以通过用Manager替换num_node来解决此问题。他们是在流程之间进行变量传递的助手。

这应该可以解决问题:

from multiprocessing import Process
from multiprocessing import Queue
from multiprocessing import Manager
import time


class Node(Process):
    num_node = Manager().Value("h",0)

    @classmethod
    def increase(cls):
        Node.num_node.value += 1

    @classmethod
    def get_num_node(cls):
        return Node.num_node.value

    ...



if __name__ == '__main__':
    nodes = []
    # CREATE 3 NODE
    for i in range(3):
        ...

现在输出如下所示:

Number of node in the INIT of NODE: 1
Number of node inside the MAIN:  1
Number of node in the INIT of NODE: 2
Number of node inside the MAIN:  2
Number of node in the INIT of NODE: 3
Number of node inside the MAIN:  3

Insert message> 0
Number of node inside the NODE: 3
Number of node inside the NODE: 3
Number of node inside the NODE: 3
Number of node inside the MAIN:  3
本文链接:https://www.f2er.com/3139017.html

大家都在问