Многопроцессорность Python выходит элегантно Как?

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()

Мне просто интересно, почему приведенный выше код действительно не печатает "вы вышли". Что я делаю не так? если да, может кто-нибудь указать мне правильный способ выйти изящно? (Я не имею в виду process.terminate или kill)

Ответ 1

Причина, по которой вы не видите этого, заключается в том, что вы не общаетесь с подпроцессом. Вы пытаетесь использовать локальную переменную (локальную для родительского процесса), чтобы сигнализировать ребенку, что он должен отключиться.

Взгляните на информацию о процедурах синхронизации. Вам нужно настроить какой-то сигнал, на который можно ссылаться в обоих процессах. После этого вы сможете щелкнуть переключатель в родительском процессе и ждать, пока ребенок умрет.

Попробуйте использовать следующий код:

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()