переменная члена многопроцессорной обработки Python не установлена - PullRequest
1 голос
/ 21 апреля 2010

В следующем скрипте я получаю вывод «Стоп сообщение получен», но процесс никогда не заканчивается. Это почему? Есть ли другой способ завершить процесс, кроме завершения или os.kill, которые находятся в этом направлении?

from multiprocessing import Process
from time import sleep

class Test(Process):
    def __init__(self):
        Process.__init__(self)
        self.stop = False

    def run(self):
        while self.stop == False:
            print "running"
            sleep(1.0)

    def end(self):
        print "stop message received"
        self.stop = True

if __name__ == "__main__":
    test = Test()
    test.start()
    sleep(1.0)
    test.end()
    test.join()

1 Ответ

3 голосов
/ 22 апреля 2010

Метод start клонировал объект в отдельный процесс, где он выполняет run. Метод end не является чем-то особенным, поэтому он выполняется в вызывающем его процессе - изменения, которые он выполняет для этого объекта, не отправляются объекту-клону.

Итак, используйте вместо этого подходящие средства межпроцессного взаимодействия, такие как multiprocessing.Evet instance, например ::

from multiprocessing import Process, Event
from time import sleep

class Test(Process):
    def __init__(self):
        Process.__init__(self)
        self.stop = Event()

    def run(self):
        while not self.stop.is_set():
            print "running"
            sleep(1.0)

    def end(self):
        print "stop message received"
        self.stop.set()

if __name__ == "__main__":
    test = Test()
    test.start()
    sleep(1.0)
    test.end()
    test.join()

Как видите, необходимые изменения минимальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...