@dadasay

Могу ли я вызвать исключение из потока A в потоке B?

К примеру в потоке B выполняется код:
....
While True:
b = 1
....

и мне требуется из потока B вызвать исключение в потоке A
Возможно ли это реализовать и если возможно то как
  • Вопрос задан
  • 401 просмотр
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Нет никакого способа сделать это средствами языка, но можно с помощью хака, использующего Cишное API CPython:
import ctypes
import threading
import time


def raise_async(thread, exception):
    if thread.ident is None:
        raise ValueError('Поток не запущен')
    r = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, ctypes.py_object(exception))
    if r == 0:
        raise ValueError('Неправильный идентификатор потока')
    elif r > 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, 0)
        raise SystemError('Неожиданное состояние среды выполнения')


def f():
    print('Поток запущен')
    try:
        while True:
            time.sleep(1)
    except ZeroDivisionError:
        print('Эй! Я же ничего не делил!')


if __name__ == '__main__':
    t = threading.Thread(target=f)
    t.start()

    time.sleep(3)
    raise_async(t, ZeroDivisionError)

    t.join()

Правда не факт, что поможет. Если поток заблокировался на вводе/выводе, то виртуальная машина просто не будет делать проверку исключений.

И повторюсь, что вашу проблему наверняка можно решить каким-нибудь иным, более правильным способом.
Ответ написан
samodum
@samodum
Какой вопрос - такой и ответ
В общем случае, нет, нельзя.
Но если в потоке А предусмотреть метод, который падает с исключением, то можно вызвать этот метод из потока Б
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы