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