Попытка убить потоки снаружи указывает на ошибку в дизайне программы. Потоки следует останавливать (если это вообще оправданно), только с кооперацией с их стороны. Это не случайность, что нет Thread.stopметода, в отличии от к примеру Process.terminate.
Чтобы периодически выполнять функцию в отдельных потоках и запускать/останавливать выполнение отдельных циклов повторения раз в минуту в соответствии с текущим содержимым входного файла, можно call_repeatedly() использовать и простой временно́й цикл:
import time
stop_calls_to = {} # hostname -> cancel future calls
while True:
with open('base.txt') as file:
hostnames = set(filter(None, map(str.strip, file)))
# stop calls to hostnames that are not in base.txt
for hostname in (stop_calls_to.keys() - hostnames):
stop_calls_to[hostname]()
del stop_calls_to[hostname]
# add new repeating calls from base.txt
for hostname in (hostnames - stop_calls_to.keys()):
stop_calls_to[hostname] = call_repeatedly(11, check_site, hostname)
time.sleep(60) # wait a minute until the next sync
watchdog позволяет следить за файлом, чтобы без долгой паузы новые изменения отслеживать.
При большом количестве сайтов, лучше асинхронные вызовы использовать (к примеру, с помощью aiohttp) вместо создания отдельного потока для каждого сайта.
base.txt. Что за строки и как они используются в функцииwork? При повторном запуске как можно определить какая строка к какому потоку относится? Функцияworkработает пока ее не остановят или сама может завершиться? – suit Dec 19 '17 at 11:15