В Python, как я могу поместить поток в сон до определенного времени?

Я знаю, что я могу заставить поток спать в течение определенного времени:

time.sleep(NUM) 

Как я могу сделать нить до 2AM? Должен ли я делать математику, чтобы определить количество секунд до 2AM? Или есть функция библиотеки?

(Да, я знаю о cron и эквивалентных системах в Windows, но я хочу спать с моим потоком в собственно python и не полагаться на внешние стимулы или сигналы процесса.)

Вот решение с половинной задницей, которое не учитывает дрожание часов или настройку часов. См. Комментарии для способов избавиться от этого.

 import time import datetime # if for some reason this script is still running # after a year, we'll stop after 365 days for i in xrange(0,365): # sleep until 2AM t = datetime.datetime.today() future = datetime.datetime(t.year,t.month,t.day,2,0) if t.hour >= 2: future += datetime.timedelta(days=1) time.sleep((future-t).seconds) # do 2AM stuff 
 import pause from datetime import datetime pause.until(datetime(2015, 8, 12, 2)) 

Один из возможных подходов – спать в течение часа. Каждый час проверяйте, находится ли время в середине ночи. Если это так, приступайте к выполнению операции. Если нет, спите еще час и продолжайте.

Если пользователь должен был изменить свои часы в середине дня, этот подход будет отражать это изменение. Хотя для этого требуется немного больше ресурсов, это должно быть незначительным.

Я попробовал «паузу» pacakage. Это не работает для Python 3.x. Из пакета пауз я извлек код, необходимый для ожидания до определенного времени и сделал следующий def.

 def wait_until(execute_it_now): while True: diff = (execute_it_now - datetime.now()).total_seconds() if diff <= 0: return elif diff <= 0.1: time.sleep(0.001) elif diff <= 0.5: time.sleep(0.01) elif diff <= 1.5: time.sleep(0.1) else: time.sleep(1) 

Чуть рядом с исходным вопросом:

Даже если вы не хотите обманывать crontabs, если вы можете планировать скрипты python для этих хостов, вам может быть интересно запланировать задачи anacron? Основным отличием анакрона от cron является то, что он не полагается, что компьютер работает непрерывно. В зависимости от конфигурации системы вам могут потребоваться права администратора даже для таких запланированных пользователем задач.

Аналогичный, более современный инструмент – это выскочка, предоставляемая людьми Ubuntu: http://upstart.ubuntu.com/ У этого еще нет необходимых функций. Но планирование работы и замена анакрона – это запланированная функция. У этого есть довольно некоторая тяга из-за его использования как замена initd по умолчанию Ubuntu. (Я не связан с проектом)

Конечно, с уже предоставленным ответом вы можете закодировать одну и ту же функциональность в вашем скрипте python, и это может подойдет вам лучше в вашем случае.

Тем не менее, для других анакрон или подобные существующие системы могут быть лучшим решением. anacron предварительно установлен во многих текущих дистрибутивах Linux (есть проблемы с переносимостью для пользователей Windows).

Википедия предоставляет страницу указателя: https://en.wikipedia.org/wiki/Anacron

Если вы собираетесь использовать версию python, я бы посмотрел на асинхронный аспект и гарантировал, что скрипт работает, даже если время изменится (переход на летнее время и т. Д.), Как уже прокомментировали другие. Вместо того, чтобы ждать до заранее рассчитанного будущего, я всегда буду ждать максимум один час, а затем повторю проверку времени. Вложенные расчетные циклы должны быть незначительными даже на мобильных, встроенных системах.

 from datetime import datetime import time, operator time.sleep([i[0]*3600 + i[1]*60 for i in [[H, M]]][0] - [i[0]*3600 + i[1]*60 for i in [map(int, datetime.now().strftime("%H:%M").split(':'))]][0])