Python - Правильно ли уничтожать / выходить из фьючерсного потока? - PullRequest
0 голосов
/ 03 октября 2018

Ранее я использовал модуль 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 является приемлемой и не применима к критике других вопросов.Это не то же самое, что "убийство".Пожалуйста, посмотрите на код, который я разместил, чтобы увидеть это.

Я не хочу убивать.Я хочу проверить, все еще ли он жив, и изящно выйти из нити самым правильным образом.Как поступить с фьючерсами?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Если вы хотите, чтобы потоки завершили свою текущую работу, используйте:

thread_executor.shutdown(wait=True)

Если вы хотите разбить текущие фьючерсы, запущенные на голове, и остановить все ... будущее ... (хех) futures use:

thread_executor.shutdown(wait=False)
for t in thread_executor._threads:
    terminate_thread(t)

Это использует вашу функцию terminate_thread для вызова исключения в потоках в исполнителе пула потоков.Те фьючерсы, которые были нарушены, вернутся с установленным исключением.

0 голосов
/ 03 октября 2018

Как насчет .cancel() в результате потока?

cancel () Попытка отменить вызов.Если вызов в данный момент выполняется и не может быть отменен, метод вернет значение False, в противном случае вызов будет отменен, а метод вернет значение True.

https://docs.python.org/3/library/concurrent.futures.html

...