Python多处理如何优雅地退出?

nwnhqdif  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(97)
import multiprocessing
import time

class testM(multiprocessing.Process):

    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.exit = False

    def run(self):
        while not self.exit:
            pass
        print "You exited!"
        return

    def shutdown(self):
        self.exit = True
        print "SHUTDOWN initiated"

    def dostuff(self):
        print "haha", self.exit

a = testM()
a.start()
time.sleep(3)
a.shutdown()
time.sleep(3)
print a.is_alive()
a.dostuff()
exit()

字符串
我只是想知道为什么上面的代码没有真正打印出“你退出了”。我做错了什么?如果是的话,谁能告诉我正确的退出方式?(我不是指进程.终止或杀死)

7vux5j2d

7vux5j2d1#

您没有看到这种情况发生的原因是因为您没有与子流程进行通信。您正在尝试使用局部变量(父进程的局部变量)来通知子进程它应该关闭。
看一下有关同步原语的信息。您需要设置一个可以在两个进程中引用的某种信号。一旦你有了这个,你应该能够在父进程中轻按开关,等待子进程死亡。
请尝试以下代码:

import multiprocessing
import time

class MyProcess(multiprocessing.Process):

    def __init__(self, ):
        multiprocessing.Process.__init__(self)
        self.exit = multiprocessing.Event()

    def run(self):
        while not self.exit.is_set():
            pass
        print "You exited!"

    def shutdown(self):
        print "Shutdown initiated"
        self.exit.set()

if __name__ == "__main__":
    process = MyProcess()
    process.start()
    print "Waiting for a while"
    time.sleep(3)
    process.shutdown()
    time.sleep(3)
    print "Child process state: %d" % process.is_alive()

字符串

相关问题