Невозможно убить процесс, в котором запущен поток

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

Я пытался как вызвать исключение, так и вызвать выход, но ничего не работает. Я попытался дождаться завершения процесса, дождавшись is_alive и вызвав join. Но оба имеют одинаковое поведение.

from multiprocessing import Process
from threading import Thread
from time import sleep


def infinite_loop():
    while True:
        print("It's sleeping man")
        sleep(1)

def start_infinite_thread():
    run_thread = Thread(target=infinite_loop)
    run_thread.start()
    exit(1)

def test_multi():
    x = Process(target=start_infinite_thread)
    x.start()
    sleep(5)
    assert not x.is_alive()

Я ожидаю, что процесс не будет живым, но утверждение не выполняется.

exit() не останавливает все потоки stackoverflow.com/questions/38804988/…
Poolka 24.06.2019 09:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо @Imperishable Night за ответ, установив поток как демон, который проходит тест. Код, который работает:

from multiprocessing import Process
from threading import Thread
from time import sleep


def infinite_loop():
    while True:
        print("It's sleeping man")
        sleep(1)

def start_infinite_thread():
    run_thread = Thread(target=infinite_loop)
    run_thread.daemon = True

    run_thread.start()
    exit(1)

def test_multi():
    x = Process(target=start_infinite_thread)
    x.start()
    sleep(1)
    assert not x.is_alive()

Другие вопросы по теме