首页 > multiprocessing.Process的实例在start后如何在外部调用实例方法改变实例的属性?

multiprocessing.Process的实例在start后如何在外部调用实例方法改变实例的属性?

先贴代码

# -*- coding: utf8 -*-
import multiprocessing
from threading import Timer
import time

class Process(multiprocessing.Process):
    def __init__(self):
        super().__init__()
        self._active = True

    def run(self):
        self.action()

    def pause(self):
        print("paused")
        self._active = False

    def action(self):
        while self._active :
            print(self._active)
            time.sleep(0.5)
        print(self._active)

p = Process()
timer = Timer(2, p.pause)
timer.start()
#p.pause()
p.start()

运行结果:

True
True
True
True
paused
True
True
True
True
True
...

在尝试实现对一个Process进行暂停操作的时候遇到了这样一个问题。我发现在一个进程(Process)开始之前,外部可以随意通过这个Process的实例来更改它的属性,而一旦这个实例start以后,我就再也无法通过调用这个类的实例或者实例的方法来改变它的属性了。
下面是对照实验:

# -*- coding: utf8 -*-
import multiprocessing
from threading import Timer
import time

class Process(multiprocessing.Process):
    def __init__(self):
        super().__init__()
        self._active = True

    def run(self):
        # 将“暂停”的操作放在run()里面,可以成功改变p._active
        timer = Timer(2, p.pause)
        timer.start()
        self.action()

    def pause(self):
        print("paused")
        self._active = False

    def action(self):
        while self._active :
            print(self._active)
            time.sleep(0.5)
        print(self._active)

p = Process()
p.start()

运行结果:

True
True
True
True
paused
False

如果在p.start()之前直接执行p.pause(),其实也可以成功改变p._active的值。
所以我似乎发现一件事情,就是Process在start(变成一个进程)以后,它像是被整个打了个包丢进了另外一个“空间”(进程)里,我在外部操作Process的实例更改的它的属性和它正在运行的这个东西已经毫无关系了。
那么有没有什么办法可以在Process实例运行后在外部调用它的方法以更改它的属性呢?

【热门文章】
【热门文章】