• Как закончить функции вызванные через asyncio.gather()?

    @Maxwell012 Автор вопроса
    Everything_is_bad, Да, вы правы, я использовал просто create_task в основном в связке с asyncio.gather и у меня создалось впечатление что не create_task вызывает задачу а asyncio.gather, но благодаря вам я осознал это, благодарю)
    Написано
  • Как закончить функции вызванные через asyncio.gather()?

    @Maxwell012 Автор вопроса
    Everything_is_bad, Вы правы, я написал криво, я переписал код:
    async def setup_services(bot: Bot):
        # CREATING A CONNECTION POOL IN DATABASE
        await db.create_pool()
    
        # COMMANDS
        await set_commands(bot=bot)
    
        # LAUNCH NOTIFIER
        notifier = Notifier(bot=bot)
        await notifier.start_notifier()
    
    
    async def on_startup(bot: Bot):
        await bot.set_webhook(f'{BASE_WEBHOOK_URL}{WEBHOOK_PATH}')
        await setup_services(bot=bot)
    
    
    async def last_message(bot: Bot):
        await bot.send_message(chat_id=Config.ADMIN_ID, text="<b>BOT STOPPED</b>")
        await bot.session.close()
    
    
    def main():
        # ALL STUFFS FOR BOT
        bot = Bot(token=Config.TOKEN_BOT, parse_mode=ParseMode.HTML)
        dp = Dispatcher(bot=bot)
        dp.startup.register(on_startup)
        app = web.Application()
        webhook_requests_handler = SimpleRequestHandler(dispatcher=dp, bot=bot)
        webhook_requests_handler.register(app, path=WEBHOOK_PATH)
        setup_application(app, dp, bot=bot)
    
        # REGISTER HANDLERS
        register_classes(dp=dp)
        basic.register_handlers(dp=dp)
        specialist.register_handlers(dp=dp)
        admin.register_handlers(dp=dp)
    
        try:
            web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)
        except Exception as ex:
            main_logger.critical(f"Bot stopped due to exception: {ex}", exc_info=True)
            # await dp.start_polling(bot)  # restart the bot
        finally:
            asyncio.run(last_message(bot=bot))
    
    
    if __name__ == "__main__":
        main()

    но если мой нотифаер будет вызываться так как щас, то он просто тормозит главную петлю и код дальше не исполняется
    Написано
  • Как закончить функции вызванные через asyncio.gather()?

    @Maxwell012 Автор вопроса
    Зачем ты вообще так криво стал делать, надо просто запустить dp.start_polling как рекомендовано в aiogram, а start_notifier перед этим запускать через dp.startup.register() или просто как create_task, не нужен тебе тут gather
    ЗЫ ну и сразу разберись с webhook, прод боты лучше уж через него запускать

    Notifier - это код который исполняется раз в 6м, пауза на 6м сделано с помощью await asyncio.sleep(300), пофакту это получается закольцованный код который должен исполняться с ботом в одной петле, поэтому я их и вызывал с помощью гейзер чтобы они могли передавать исполнение между собой
    Написано
  • Как закончить функции вызванные через asyncio.gather()?

    @Maxwell012 Автор вопроса
    а это что за? 100500 раз сказано, делайте сервис для systemd

    Я делаю сервис, но когда нужно быстро протетсить что-то на сервисе то я его просто запускаю в консоле
    Написано
  • Как закончить функции вызванные через asyncio.gather()?

    @Maxwell012 Автор вопроса
    Иерокопус Таманский, обнову когда например хочу загрузить нужно остановить и заново запустить
    Написано
  • Как вызвать асинхронный декоратор с дочернего класса?

    @Maxwell012 Автор вопроса
    Everything_is_bad, вы правы, просто изначально это был кеш по аргументам, но я решил чуть переделать и сделать для городов отдельную кеш функцию и чет не подумал что это уже не дикоратор и пофакту уже не кеш, а просто работа с бд
    Написано
  • Как вызвать асинхронный декоратор с дочернего класса?

    @Maxwell012 Автор вопроса
    Everything_is_bad, да, но этот кеш сохраняется не посредственно в бд в таблицу сити, поэтому это отдельный декоратор именно для сохранения в бд
    Написано
  • Как сделать паузу в 1с между асинхронными запросами?

    @Maxwell012 Автор вопроса
    нам конечно уже угадывать, чё ты там понаписал?

    Классика жанра:
    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(). Можно конечно создавать дополнительный поток, но я в коде не хотел смешивать асинхронность и синхронность, или же вы имели виду создание асинхронной задачи?
    Написано
  • Как сделать асинхронность в процессах?

    @Maxwell012 Автор вопроса
    Everything_is_bad, Мне просто важно понимать все варианты решения вопроса чтобы решить его максимально продуктивно. Я все таки решил пока что запускать код вместе с моим ботом но с увеличением обьемов я скорее всего его вынесу в отдельный процесс.
    Спасибо за ваши ответы)
    Написано
  • Как сделать асинхронность в процессах?

    @Maxwell012 Автор вопроса
    Roman K, я бы хотел сделать 2 процесса и в каждом из процессов нужно запустить асинхронный скрипт
    Написано
  • Как сделать асинхронность в процессах?

    @Maxwell012 Автор вопроса
    Я понимаю что я могу использовать крон, но это по факту один проект и для удобства я бы хотел запускать их вмести + этому классу нужны другие элементы в этом проекте, не хотелось бы создавать экземпляры которые уже и так есть.
    На счет асинхронности, как я сказал первая задача это бот, мне нужно обеспечить непрерывное выполнение этого бота чтобы люди не ждали, а эта задача будет выполняться приблизительно секунд 10 например, поэтому я бы хотел распаралелить это.
    Написано
  • Как парсить OnlyFinder?

    @Maxwell012 Автор вопроса
    напиши в телеграм @neponyatnuy
    Написано
  • Какие есть либы для проверки правописания города?

    @Maxwell012 Автор вопроса
    использую api яндекс геокодер, но я там не могу проверить город на правильное написание(. Мне нужны населенные пункты не только России + мне нужно все переводить в латиницу чтобы в бд хранить
    Написано
  • Какие есть либы для проверки правописания города?

    @Maxwell012 Автор вопроса
    Сергей Водаков, не знаете случайно где я могу найти словарь населенных пунктов, может есть какой-то сайт с словарями?
    Написано
  • Какие есть либы для проверки правописания города?

    @Maxwell012 Автор вопроса
    Сергей Водаков, я так и думал, но надежды были на либу. Но вы правы, это не проблема)
    Написано
  • Как организовать планировщик заданий?

    @Maxwell012 Автор вопроса
    Saboteur, я пока что поставил предположительные границы для себя это 300к задач в день. Я подумал что если раз в минуту не потянет то увеличу до 5 или до 10мин так как это особо не повлияет на работу моего скрипта.
    Написано
  • Как организовать планировщик заданий?

    @Maxwell012 Автор вопроса
    Saboteur, извиняюсь что долго не отвечал. Хочу тогда подвести итог, лучшим вариантом будет орендовать сервак с процессором на 3> ядер, сделать отдельный класс который будет вызываться каждую минуту с планировщика как отдельный скрипт (имею виду на отдельном ядре) для создания выборки с БД, потом соотвественно создание асинхронной задачи под каждое уведомление и запуск этого всего например через aiogram.gather(*tasks). В случаи падение производительности, просто уменьшать частоту вызова класса в планировщике. Если я правильно все понял, то так приблизительно выглядит план моих действий, верно?
    Написано
  • Как организовать планировщик заданий?

    @Maxwell012 Автор вопроса
    Saboteur, Просто поймите меня правильно, я всего лишь пытаюсь найти самое производительное решение, чтобы потом не переписывать его много раз. Поэтому я думал например написать какой-то триггер в постгрескл который когда время указанное в колонке равно настольному времени будет вызывать функцию, может так будет лучше чем постоянно запросы слать внешне?
    Написано
  • Как организовать планировщик заданий?

    @Maxwell012 Автор вопроса
    Saboteur, 1 я просто уточнить хотел. 3 В базе у меня храниться timestamp. Мне вполне нравиться решение которое вы предложили, я приблизительно так и думал что оно будет, просто в силу того что я подобное не делал, а говнокод я не люблю, поэтому я посчитал будет лучше спросить.
    Даже сейчас когда я уже сравнил планировщик с сохранением в бд, я чувствую некую неуверненность, хотя очевидно что в данной ситуации с достаточно длинным отлаживанием планировщик будет работать хуже.
    Написано