Выход из многопроцессорного Python Элегантно Как? - PullRequest
42 голосов
/ 05 августа 2009
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 Ответ

46 голосов
/ 05 августа 2009

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

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

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...