Python3: убить основной поток при утверждении в другом потоке - PullRequest
0 голосов
/ 14 сентября 2018

Пожалуйста, смотрите этот код:

#! /usr/bin/env python3

import threading
import time


def asserter():
    time.sleep(3)
    assert False


threading.Thread(target=asserter).start()

while True:
    print('Main')
    time.sleep(1)

Мне нужно, чтобы основной цикл умер, когда запускается утверждение.Как это сделать?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Благодаря 101 я изменил свой код:

#! /usr/bin/env python3

import threading
import time


class Flag:
    exception = None


def asserter(flag):
    time.sleep(3)
    try:
        assert False
    except Exception as e:
        flag.exception = e


threading.Thread(target=asserter, args=(Flag,)).start()

while not Flag.exception:
    print('Main')
    time.sleep(1)
raise Flag.exception

Теперь я могу завершить основную программу и посмотреть, что произошло

0 голосов
/ 14 сентября 2018

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

import threading
import time

class Flag:
    ended = False

def asserter(flag):
    time.sleep(3)
    try:
        assert False
    except AssertionError:
        flag.ended = True


thread = threading.Thread(target=asserter, args=(Flag,))
thread.start()

while not Flag.ended:
    print('Main')
    time.sleep(1)
print('done')
...