Непонятная работа time.sleep()

Рейтинг: 0Ответов: 1Опубликовано: 12.04.2023

Этот код проверяет, какое сейчас время и если время совпадает с указанным значением, то код отправляет уведомление. Почему-то код отправляет уведомления на час позже, хотя в 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 час.