Непонятная работа time.sleep()
Этот код проверяет, какое сейчас время и если время совпадает с указанным значением, то код отправляет уведомление. Почему-то код отправляет уведомления на час позже, хотя в else нету time.sleep()
import time
import datetime
from threading import Thread
def minute1():
print("Функция проверки 18 часов - запущена -")
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
Time = int(now.hour)
while Time != 18:
print("1 поток в режиме ожидания -\n")
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
Time = int(now.hour)
print(Time)
time.sleep(3600)
else:
week = now.isoweekday()
with open("TiMe.txt", mode="r", encoding="utf-8") as code:
s = code.read()
if s != str(week):
with open("TiMe.txt", mode="w", encoding="utf-8") as ime:
ime.write(str(week))
print("Отправка уведомления -")
return
def minute2():
print("Функция проверки 17 часов - запущена -")
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
Time = int(now.hour)
while Time != 17:
print("2 поток в режиме ожидания -\n")
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
Time = int(now.hour)
print(Time)
time.sleep(3600)
else:
week = now.isoweekday()
with open("TiMe.txt", mode="r", encoding="utf-8") as code:
s = code.read()
if s != str(week):
with open("TiMe.txt", mode="w", encoding="utf-8") as ime:
ime.write(str(week))
print("Отправка уведомления -")
print("Уведомление отправлено -")
return
def weekly():
print("Функция день недели запущена -")
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
week = now.isoweekday()
while True:
with open("TiMe.txt", mode="r") as t:
s = t.read()
Datetime = datetime.timezone(datetime.timedelta(hours=3))
now = datetime.datetime.now(Datetime)
week = now.isoweekday()
week = str(week)
if s != week:
with open("TiMe.txt", mode="w") as m:
m.write(week)
print("Изменение дня недели -")
print("Перезапуск консоли -")
Tread()
return
else:
print("3 поток в режиме ожидания -\n")
time.sleep(3600)
def Tread():
print("Консоль создана -")
Thread(target=minute1).daemon = True
Thread(target=minute2).daemon = True
Thread(target=weekly).daemon = True
print("Потоки завершены -")
Thread(target=minute1).start()
Thread(target=minute2).start()
Thread(target=weekly).start()
print("Потоки созданы -")
Tread()
Время sleep(), можно уменьшить, чтобы легче проверить
Ответы (1 шт):
В вашем коде хоть и присутствует большое количество странных решений, тем не менее ошибок в логике я не вижу. Однако я бы предложил использовать вместо самописных решений использовать библиотеку schedule предназначенную для вызова функций по времени. Установка:
pip install schedule
Использование:
import schedule
import datetime
def event_function(): # функция которую мы должны запускать по времени
timezone = datetime.timezone(datetime.timedelta(hours=3))
current_time = datetime.datetime.now(timezone)
print(f"Функция запущена в {current_time.hour} часов.")
week = current_time.isoweekday()
with open("TiMe.txt", mode="r", encoding="utf-8") as file:
s = file.read()
if s != str(week):
with open("TiMe.txt", mode="w", encoding="utf-8") as file:
file.write(str(week))
print("Отправка уведомления -")
schedule.every().day.at("17:00").do(event_function) # Регистрируем вызов функции event_function на 17:00
schedule.every().day.at("18:00").do(event_function) # Регистрируем вызов функции event_function на 18:00
# Запускаем тактирование с периодичностью 1 секунду, желательно запускать в отдельном потоке
while True:
schedule.run_pending()
time.sleep(1)
В итоге функция event_function будет выполняться в 17:00 и 18:00 каждый день(естественно вы можете изменить на неделю или месяц). В случае если вам не надо слишком высокая точность времени вызова функции вы можете изменить частоту тактирования например на 60 секунд, а то и вовсе на 1 час.