import aiohttp
import asyncio
import time
async def get_time_zone(lat, lon):
url = f""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
print(await response.text(), response.status)
async def main():
lat = 37.7749
lon = -122.4194
start = time.time()
for _ in range(10):
await get_time_zone(lat, lon)
await asyncio.sleep(1)
print("time: ", time.time()-start)
asyncio.run(main())
ну так не делай тупо gather, а делай один обычный цикл (или очередь), внутри которого запрос к сайту и asyncio.sleep(1) после него
я же сказал что эта функция находиться в асинхронном боте и можно считать что тоже самое что и asyncio.gather(). Можно конечно создавать дополнительный поток, но я в коде не хотел смешивать асинхронность и синхронность, или же вы имели виду создание асинхронной задачи?
Everything_is_bad, Мне просто важно понимать все варианты решения вопроса чтобы решить его максимально продуктивно. Я все таки решил пока что запускать код вместе с моим ботом но с увеличением обьемов я скорее всего его вынесу в отдельный процесс.
Спасибо за ваши ответы)
Я понимаю что я могу использовать крон, но это по факту один проект и для удобства я бы хотел запускать их вмести + этому классу нужны другие элементы в этом проекте, не хотелось бы создавать экземпляры которые уже и так есть.
На счет асинхронности, как я сказал первая задача это бот, мне нужно обеспечить непрерывное выполнение этого бота чтобы люди не ждали, а эта задача будет выполняться приблизительно секунд 10 например, поэтому я бы хотел распаралелить это.
использую api яндекс геокодер, но я там не могу проверить город на правильное написание(. Мне нужны населенные пункты не только России + мне нужно все переводить в латиницу чтобы в бд хранить
Saboteur, я пока что поставил предположительные границы для себя это 300к задач в день. Я подумал что если раз в минуту не потянет то увеличу до 5 или до 10мин так как это особо не повлияет на работу моего скрипта.
Saboteur, извиняюсь что долго не отвечал. Хочу тогда подвести итог, лучшим вариантом будет орендовать сервак с процессором на 3> ядер, сделать отдельный класс который будет вызываться каждую минуту с планировщика как отдельный скрипт (имею виду на отдельном ядре) для создания выборки с БД, потом соотвественно создание асинхронной задачи под каждое уведомление и запуск этого всего например через aiogram.gather(*tasks). В случаи падение производительности, просто уменьшать частоту вызова класса в планировщике. Если я правильно все понял, то так приблизительно выглядит план моих действий, верно?
Saboteur, Просто поймите меня правильно, я всего лишь пытаюсь найти самое производительное решение, чтобы потом не переписывать его много раз. Поэтому я думал например написать какой-то триггер в постгрескл который когда время указанное в колонке равно настольному времени будет вызывать функцию, может так будет лучше чем постоянно запросы слать внешне?
Saboteur, 1 я просто уточнить хотел. 3 В базе у меня храниться timestamp. Мне вполне нравиться решение которое вы предложили, я приблизительно так и думал что оно будет, просто в силу того что я подобное не делал, а говнокод я не люблю, поэтому я посчитал будет лучше спросить.
Даже сейчас когда я уже сравнил планировщик с сохранением в бд, я чувствую некую неуверненность, хотя очевидно что в данной ситуации с достаточно длинным отлаживанием планировщик будет работать хуже.
Saboteur, каждая дата это отдельная строка, просто проверяя каждую секунду например 1м записей это ужасная затрата ресурсов, раз в 5м тоже такое себе, нужно тогда учитывать что дата уже могла на 5м быть пройдена. Я думал может есть чет на подобие вебхуков, то есть когда остался час до даты отправлялся запрос мне в основной скрипт который обрабатывал его и все, то есть чтобы нужная дата сама отправлялась. Тоесть мой скрипт просто ожидает например запрос который прийдет от бд и тогда его исполняет, хотя возможно это так и устроенно что есть просто скрипт в постгрескл который постоянно проверяет дату, но я бы хотел какой-то триггер чтоли. Надеюсь я понятно высказался
Maxwell012, Если это поможет, то я думаю сохранят в планировщик только одну переменную что является индентификатором на определнную строку в бд и когда ее время исполнение доходит то уже через айди достоется нужная информация с бд и отправляется оповещение клиенту. Я имею виду что я не буду хранить много информации для запуска одной задачи, поэтому миллион задач в планировщике даже если в оперативе это не так уж много, но мне нужно рассчитывать на то что вес задач может привышать обьем оперативной памяти поэтому лучше сохранять их на диск плюс это защитит меня от перезагрузки сервера и т.д.
извиняюсь за неточную информацию, было тяжело сформулировать. У меня есть бот на python + aiogram, пользователи регистрируюца на определнное событие дата которого может быть хоть через 3 месяца (может и больше, но пока что я взял эту орентировачную длину), так вот мне нужно чтобы когда до назначиной даты оставался день отправить сообщение предупреждающее + когда останиться 3 часа еще одно оповещение. Я просто не сильно вижу смысл помещать в планировщик задачи которые могут быть использованы через 3 месяца. Количество запросов я не могу точно сказать, но я орентируюсь на то что запланнированных задач может быть миллион. Я не совсем понимаю где планировщики хранят задачи, они хранят в оперативной памяти или сохраняют их на диск, просто если они сохраняются на диск то впринципе планировщики идеально подходят потому что мне не нужны задачи в оперативе которые исполняться только через 3 месяца
ваш код не проверял но думаю он рабочий, я уже разобрался с этим вопросом и у меня похожий код как у вас). Мне только не нравиться то что для создания бд нужно как минимум один еще метод вызывать чтобы создать пул, но это не проблема просто моя привередливость
Классика жанра:
я же сказал что эта функция находиться в асинхронном боте и можно считать что тоже самое что и asyncio.gather(). Можно конечно создавать дополнительный поток, но я в коде не хотел смешивать асинхронность и синхронность, или же вы имели виду создание асинхронной задачи?