Проблема с asycio.sleep(), как исправить?

почему то оно в Москве работает правильно, но в других странах чаще всего из Азии, пишут что они ждут часами, а другие пользователи говорят что у них всё норм

import sqlite3
import upgrade
import users
from datetime import datetime, timedelta
import asyncio

async def add_energy():
    while True:
        for user_id in users.get_users():
            current_energy = users.get_energy(user_id)
            current_level = users.get_level(user_id)
            max_energy_limit = users.max_energy(current_level)
            if current_energy < max_energy_limit:
                new_energy = min(current_energy + 5, max_energy_limit)
                users.update_energy(user_id, new_energy)
                print(user_id, current_energy, max_energy_limit)
        await asyncio.sleep(60)
        

async def check_users():
    while True:
        with sqlite3.connect("Путь") as conn: # с путём всё норм
            cursor = conn.cursor()
            for user_id in upgrade.get_users():
                track = upgrade.get_track(user_id)  # track is 30 or 60
                purchase_time_str = upgrade.get_time(user_id)  # Assuming this returns a string
                purchase_time = datetime.strptime(purchase_time_str, '%Y-%m-%d %H:%M:%S')
                
                expire_time = purchase_time + timedelta(minutes=int(track))
                
                if datetime.now() > expire_time:
                    upgrade.user_delete(user_id)
            await asyncio.sleep(60)

async def main():
    task1 = asyncio.create_task(add_energy())
    task2 = asyncio.create_task(check_users())
    await asyncio.gather(task1, task2)
    

if __name__ == '__main__':  # Fixed the name check
    asyncio.run(main())

Ответы (1 шт):

Автор решения: ʏʊքɨ

короче, не знаю что творится в других частях, по типу users и upgrade, но хочу одно сказать, лучше их переписать в ассинхронный вид и в этом коде уже используются ассинхронные методы:

import sqlite3
import upgrade
import users
from datetime import datetime, timedelta
import asyncio
import aiosqlite  # Переход на асинхронный драйвер БД
from pytz import utc  # Работа с часовыми поясами

# --- Исправление 1: Асинхронные запросы к БД ---
async def add_energy():
    while True:
        for user_id in users.get_users():
            current_energy = users.get_energy(user_id)
            current_level = users.get_level(user_id)
            max_energy_limit = users.max_energy(current_level)
            if current_energy < max_energy_limit:
                new_energy = min(current_energy + 5, max_energy_limit)
                await users.update_energy(user_id, new_energy)  # Должно быть асинхронным!
        await asyncio.sleep(60)

# --- Исправление 2: UTC-время и асинхронность ---
async def check_users():
    while True:
        async with aiosqlite.connect("Путь") as conn:  # Используем aiosqlite
            cursor = await conn.cursor()
            for user_id in await upgrade.get_users():  # Предполагаем асинхронный get_users
                track = await upgrade.get_track(user_id) 
                purchase_time_str = await upgrade.get_time(user_id) 
                
                # Конвертируем время в UTC
                purchase_time = datetime.strptime(purchase_time_str, '%Y-%m-%d %H:%M:%S').replace(tzinfo=utc)
                expire_time = purchase_time + timedelta(minutes=int(track))
                current_time = datetime.now(utc)  # Используем UTC время
                
                if current_time > expire_time:
                    await upgrade.user_delete(user_id)
            await asyncio.sleep(60)

# --- Исправление 3: Запуск с обработкой ошибок ---
async def main():
    task1 = asyncio.create_task(add_energy())
    task2 = asyncio.create_task(check_users())
    await asyncio.gather(task1, task2, return_exceptions=True)  # Ловим исключения

if __name__ == '__main__':
    asyncio.run(main())

Почему возникала проблема в Азии?

Часовые пояса: Сравнение локального времени сервера (Москва) с UTC могло давать расхождения.

Блокирующие вызовы: Синхронные операции с БД sqlite3 тормозили цикл событий, особенно при высокой нагрузке.

Сетевые задержки: В некоторых регионах могли возникать таймауты при синхронных запросах.

также можно задуматься о добавлении логики для логгирования и повторения попыток, для этого существует довольно много самых разных библиотек

→ Ссылка