Остановить поток если он долго выполняется (python)

zek24

Мой дом здесь!
Команда форума
Модератор
Регистрация
14 Ноя 2009
Сообщения
811
Реакции
310
  • Автор темы
  • Модер.
  • #1
Привет.
Изучаю потоки и возник вопрос: как остановить один из них, если, скажем он выполняется более n секунд.
Нашел signal.alarm(n) но не хочет работать на винде, а это принципиально.


Код:
from concurrent.futures import ThreadPoolExecutor, as_completed
from time import sleep

y = ...
def x(Proxy):
    ...
     try:     
        signal.alarm(2) #не дружит с виндой(
        time.sleep(5)
        do_some
       
    except Exception as error:
        print(error)
    finally:
        ...


with ThreadPoolExecutor(max_workers=3) as executor:
    executor.map(x, y)

Как можно по другому обойтись?
Гугл не помог(
 
Python:
atexit.unregister(concurrent.futures.thread._python_exit)
Может нечто такое
 
Можно использовать concurrent.futures и его функцию ThreadPoolExecutor. Для остановки выполнения задачи, которая выполняется более n секунд есть функция concurrent.futures.wait() с параметром timeout.

Пример (5 с)

Python:
from concurrent.futures import ThreadPoolExecutor, as_completed, wait
from time import sleep

def x(Proxy):
# твой код
sleep(5)  # Пример задержки

y = [1, 2, 3]  # Пример списка Proxy

with ThreadPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(x, proxy) for proxy in y]

# ожидаем завершения всех задач или до истечения n секунд
completed, not_completed = wait(futures, timeout=2)

for future in not_completed:
# если задача не завершилась вовремя отменяем её выполнение
        future.cancel()

# завершенные задачи
for future in completed:
try:
        result = future.result()
# обработка успешных задач
except Exception as error:
# обработка ошибок в задачах
print(error)


код создает список задач futures, каждая из которых представляет выполнение функции x с определенным значением Proxy. Затем используем concurrent.futures.wait() для ожидания завершения всех задач или до истечения n секунд. Если какая-либо задача не завершится вовремя, мы отменяем её выполнение с помощью future.cancel().
 
Назад
Сверху