Проблема с 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 тормозили цикл событий, особенно при высокой нагрузке.
Сетевые задержки: В некоторых регионах могли возникать таймауты при синхронных запросах.
также можно задуматься о добавлении логики для логгирования и повторения попыток, для этого существует довольно много самых разных библиотек