Завершить поток и/или планировщик

#python #python-multithreading #scheduler

Вопрос:

Я более или менее новичок в Python, поэтому, возможно, я использую неправильные инструменты для этой работы. Или, может быть, я использую правильные инструменты, но не правильно.

Вот что я пытаюсь сделать.

 def stand_by(self, evt_time, number): """Waiting for scheduled time Starts a scheduler in a separate thread that will run in the background until a specific time is reached, usually a time in a flight's schedule. Once that specific time is reached, the program will regularly check if the state of the flight has changed as expected.   Args: evt_time (:obj:`datetime`): The scheduled time of the status change. Schedulers need Unix timestamps, so this has to be converted inside the function. number (str): Flight number of the flight that should be observed. This function itself does not need it but it has to be passed on as an argument. """  # evt_time is given in UTC time but needs to be checked against  # system time  scheduler = sched.scheduler(time.time, time.sleep)  tz = pytz.timezone(player.tz)   # Turns the event time from datetime UTC into datetime player actual  evt_time = pytz.utc.localize(evt_time).astimezone(tz)   # Turns the datetime object into a UNIX time stamp  evt_time = evt_time.timestamp()   threading.Thread(target=lambda: scheduler.enterabs(  evt_time, 2, check_dep, [number])).start()  scheduler.run()  

Пользователь выбирает рейс, на который он хочет «сесть». Допустим, сейчас 1 час дня, а рейс должен вылететь в 2 часа дня. Программа запустит планировщик, который позже запустит «слушателя» в 2 часа дня, чтобы узнать, вылетел ли рейс. Чтобы пользователь мог продолжать использовать программу до 2 часов дня, планировщик выполняется в отдельном потоке. Я пытаюсь понять, как я могу завершить этот поток и/или планировщик, если пользователь решит выбрать другой «рейс» до 2 часов дня. Кажется, я не могу найти элегантный способ завершения потоков.
Я нашел threading.timer, который можно отменить, но для этого требуется временной интервал, а не объект времени…

Я вообще не женат на этой функции. Что мне нужно, так это способ запустить другую функцию в определенное время, чтобы программа оставалась полезной и могла быть прекращена, если пользователь передумает. Большое спасибо за идеи!

Комментарии:

1. Это просто не так, как вы используете потоки (хотя это очень популярная первая попытка): обычно вы ждете чего-то вроде переменной условия с таймаутом, и переменная уведомляется, если в расписание вносятся какие- либо изменения, которые требуют (или могут потребовать) пересчета ожидания.