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

时间:2018-11-10 14:54:44

标签: python multiprocessing

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

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?我有什么想念的吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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