繁体   English   中英

Python3中的多处理流程的实例变量未在终止时编写

[英]Instance variable of multiprocessing Process in Python3 not being written on terminate

我在编写过程终止期间节省一些价值的逻辑时遇到了一件令人惊讶的事情,这对我来说有点奇怪。 编写一个玩具示例程序来显示问题。

import multiprocessing
import time

class A(multiprocessing.Process):
    def __init__(self):
        self.till = 0
        super(A, self).__init__()

    def run(self):
        i = 0
        while True:
            print(i)
            i += 1
            self.till = i
            time.sleep(1)

    def terminate(self):
        print("Terminating : {}".format(self.till))
        super(A, self).terminate()

if __name__ == "__main__":
    obj = A()
    obj.start()
    time.sleep(5)
    obj.terminate()

上面程序的输出是-

0
1
2
3
4
Terminating : 0

为什么terminate()无法打印出4? 我有什么想念的吗?

init和终止方法在主进程上运行,因此子进程为您的终止函数输出0。 运行方法仅在子过程中递增。 您可以通过在python中使用os.getpid()方法来确认这一点。

编辑:此问题可能仅在Windows中发生,因为它没有像Linux / Unix系统中那样的fork()系统调用。 Windows从一开始就启动整个模块以达到效果。

您正在执行的操作实际上是在主进程上终止,请看以下代码:

class A(multiprocessing.Process):
def __init__(self):
    self.till = 0
    super(A, self).__init__()

def run(self):
    i = 0
    print(os.getpid())
    while True:
        print(i)
        i += 1
        self.till = i
        time.sleep(1)

def terminate(self):
    print("Terminating : {}".format(self.till))
    print(os.getpid())
    super(A, self).terminate()

if __name__ == "__main__":
    print("parent pid:")
    print(os.getpid())
    print("child pid:")
    obj = A()
    obj.start()
    time.sleep(3)
    obj.terminate()

将导致输出:

parent pid:
12111
child pid:
12222
0
1
2
Terminating : 0
12111

在终止时,实际上是将SIGTERM发送到子进程,这是从父进程完成的,因此内存是父进程的内存,其中self.till没有增量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM