python многопроцессорная обработка после процесса уничтожения дает статус is_alive () True - PullRequest
0 голосов
/ 17 марта 2020

Я изучил документацию python (3.7), чтобы понять концепцию многопроцессорности. Для объекта Process существует два метода terminate() и kill. Завершение процесса выполняется с помощью SIGTERM, а для уничтожения процесса используется сигнал SIGKILL на Unix.

Когда мы завершаем процесс и проверяем is_alive() статус процесса, который он дает False. но когда я использую kill и проверяю статус процесса, он дает is_alive() статус True. Я не знаю, почему он дает True после завершения процесса, если он совпадает с процессом завершения.

def test():
    print("in test method")
    time.sleep(3)


if __name__ == '__main__':
    p1 = Process(target=test)
    p1.start()  # start process

    # kill process after 1 sec
    time.sleep(1)
    p1.kill()
    print(p1.is_alive())  # why process alive status true when kill process
    time.sleep(3)
    print(p1.is_alive())

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Используете ли вы kill или terminate, эти методы только запускают завершение процесса. Затем вы должны дождаться завершения процесса полностью с помощью join (если вы попытаетесь использовать sleep, вы только догадаетесь, сколько времени длится сон для полного завершения процесса):

p1.kill()
p1.join() # wait for p1 to fully complete
print(p1.is_alive()) # prints False
1 голос
/ 17 марта 2020

Я думаю, что причина этого в том, что время между функциями p1.kill() и print(p1.is_alive()) очень короткое. Поэтому я думаю, что интерпретатор пытается напечатать на экране, активен ли процесс до завершения этой команды уничтожения.

Например, если вы поставили time.sleep(0.001) между p1.kill() и print(p1.is_alive()) функции, будет напечатано False значение, а не True значение.

import time
from multiprocessing import Process


def test():
    print("in test method")
    time.sleep(3)


if __name__ == '__main__':
    p1 = Process(target=test)
    p1.start()  # start process

    # kill process after 1 sec
    time.sleep(1)
    p1.kill()
    time.sleep(0.001)  # Wait for p1.kill() function is finished.
    print(p1.is_alive())  # why process alive status true when kill process
    time.sleep(3)
    print(p1.is_alive())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...