Нет никакого способа сделать это средствами языка, но можно с помощью хака, использующего 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()
Правда не факт, что поможет. Если поток заблокировался на вводе/выводе, то виртуальная машина просто не будет делать проверку исключений.
И повторюсь, что вашу проблему наверняка можно решить каким-нибудь иным, более правильным способом.