Ранее я использовал модуль threading.Thread
.Сейчас я использую concurrent.futures
-> ThreadPoolExecutor
.Ранее я использовал следующий код для выхода / уничтожения / завершения потока:
def terminate_thread(thread):
"""Terminates a python thread from another thread.
:param thread: a threading.Thread instance
"""
if not thread.isAlive():
return
exc = ctypes.py_object(SystemExit)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(
ctypes.c_long(thread.ident), exc)
if res == 0:
raise ValueError("nonexistent thread id")
elif res > 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
Это не похоже на работу с интерфейсом фьючерсов.Какова лучшая практика здесь?Просто return
?Мои темы контролируют экземпляры Selenium.Мне нужно убедиться, что когда я уничтожаю поток, экземпляр Selenium разрушается.
Редактировать: я уже видел пост, на который ссылается как на дубликат.Этого недостаточно, потому что, когда вы решаетесь на что-то вроде будущего, поведение может радикально отличаться.В случае с предыдущим модулем потоков, моя функция terminate_thread
является приемлемой и не применима к критике других вопросов.Это не то же самое, что "убийство".Пожалуйста, посмотрите на код, который я разместил, чтобы увидеть это.
Я не хочу убивать.Я хочу проверить, все еще ли он жив, и изящно выйти из нити самым правильным образом.Как поступить с фьючерсами?