Ответы пользователя по тегу Python
  • Как использовать Tracemalloc для оптимизации использования памяти?

    Смотреть потребление памяти сразу после запуска неправильно. Надо смотреть как минимум после того, как бот обработает 5-10 запросов (причем если в боте есть разные команды, то надо чтобы он обработал все из них).
    Советую недельку понаблюдать за памятью, только смотреть (условно) раз в день и записывать значения. Если потребление памяти в какой-то момент перестанет расти, то это значит, что никакой утечки нет и это нормальное потребление памяти для вашего бота. Если это потребление для вас слишком большое, то тогда нужно смотреть, что конкретно эту память потребляет и как это потребление уменьшить.
    Если же потребление растет постоянно в течение длительного времени, то есть утечка и надо ее исправлять. В питоне утечка памяти скорее всего будет из-за того, что бот сохраняет что-то в глобальные переменные в процессе работы. Если такого нет, то утечка в какой-нибудь библиотеке. В любом случае, это без кода не понять.
    Ответ написан
    2 комментария
  • Реализация вложенных атрибутов класса?

    class _ContextState(enum.Enum):
       ...
    
    class AsyncSocket(Context):
        def __init__(self, *args):
            self._state = _ContextState.INITIAL

    Если короче, то:
    1. вложенные классы - это плохо
    2. названия классов всегда в PascalCase
    3. как и методы, классы могут быть приватными, если их название начинается с символа подчеркивания
    4. если все объекты класса предназначены только для внутреннего использования, то этот класс можно сделать приватным


    Хотя иногда все же можно использовать вложенные классы, но только если они приватные и нужны только в одном классе:
    class Context:
        class _State(enum.Enum):
            ...
    
        def __init__(self):
            self._state = Context._State.INITIAL
    Ответ написан
  • Почему html разный?

    А у меня и в режиме исходного кода, и в инспекторе, и даже на самой странице цифры такие же, как у Вас в исходном коде. Предположу, что все дело в авторизации, а точнее в том, что цифры на странице, которую отдает сервер (исходный код) - это просто заглушка, а реальные данные передаются позже через js/xhr. Ищите в инспекторе на вкладке "сеть" нужные запросы и пытайтесь их повторить.
    Второй вариант - selenium - это по сути полноценный браузер, который будет управляться из вашей программы.
    Ответ написан
    Комментировать
  • Python, как сделать много запросов и получить ответ без ошибок?

    Во-первых, НИКОГДА не мешайте многопоточность с асинхронностью. Асинхронность придумали для того, чтобы не делать потоки.

    Если я правильно понял, то Вы хотите сделать программу, которая проверяет работоспособность множества сайтов одновременно.
    Смотрите:
    Как можно увеличить либо число потоков, либо просто число проверок за раз?

    Делайте несколько "воркеров" - то есть просто запускайте программу несколько раз. НО делать это на одном устройстве все равно скорее всего не будет никакого смысла, так как основная нагрузка будет на сеть, а не на процессор.

    Предварительно я их распихиваю по нескольким серверам, к примеру 5 шт. Значит на один сервер выходит 20 тысяч за раз. Все эти задачи сначала попадают в свои БД, на своих серверах, а потом их можно сливать в одну общую таблицу. Но можно и читать данные из разных серверов ...

    Вот именно так. Но базу данных можно делать одну на все сервера (sqlite не подойдет, mysql или postgreesql будут не плохим вариантом). Вы делаете основной сервер, где будет БД и 1 воркер и множество доп. серверов с 1 воркером на каждом, которые подключаются к БД на основном.

    Дальше стоит понять, чем асинхронный запрос отличается от синхронного.
    Запрос
    6102683738193554639408.png
    (максимально упрощенно, обычно все сложнее).
    1. Синхронный: все время, отмеченное красным программа не работает, Ваша ОС приостанавливает ее выполнение. Получается, что программа одновременно может выполнять лишь один запрос, при этом большую часть времени она ничего не делает.
    2. Асинхронный: ОС сразу возвращает ответ, типа "будет сделано" и программа может работать дальше. Но вам ведь нужен конкретный ответ, поэтому asyncio пока ждет ответа от ОС (которая ждет ответа от сервера), может выполнять другие задачи (например, начинать другие запросы). Теперь ваша программа может делать несколько запросов одновременно, их количество зависит уже от ОС и сети.

    Как правильно учесть вариант того, что страницы могут задерживать ответ, таймаут, но насколько грамотное это решение получиться?

    ОС будет сама отслеживать таймауты для каждого запроса отдельно. Таймаут можно указать руками при создании запроса, если этого не сделать, то он будет равен 5 минут (что для синхронного запроса ооочень много, но для асинхронного сойдет). Про таймаут можно почитать в документации.

    Про задачи в asyncio. Чтобы выполнить несколько функций (псево)параллельно используется функция asyncio.gather():
    async def make_request(address):
        ...
        return address, response  # чтобы потом можно было понять, на что это ответ
    
    async def main():
        urls = [...]
        reqs = []
        for url in urls:
            reqs.append(make_request(url))  # Обратите внимание на отсутствие await, нам не нужно ждать завершения сейчас
    
        results = await asyncio.gather(reqs)  # gather объединяет несколько корутин в одну, теперь мы ждем, пока выполнятся все запросы
        # теперь results - list[tuple[<address>, <response>]]
        for url, result in results:
            print(...)  # print можно делать и в обработчике, тут уже зависит от того, что вы хотите сделать с ответом

    Есть и другие способы запуска задач (ensure_future и create_task, возможно они вам больше подойдут).

    Как правильно обрабатывать ответы, если будет приходить много данных за раз?

    Каждый ответ обрабатывайте отдельно. Прямо сразу после запроса (в примере в функции make_request). Вот пример из документации.

    Когда пишете код с aiohttp не забывайте, что async with session.get(...) as resp: и есть запрос. async with по сути внутри себя содержит await, поэтому пока выполняется такой код может выполниться еще несколько параллельных задач.

    Еще отлаживать асинхронный код довольно сложно, поэтому используйте логирование (можно начать с обычных print-ов, только не print("xx") и print("yy"), а print(f"Starting request to {url}...") и print(f"Got response from {url}...") - иначе вы не сможете понять, какой сайт долго отвечает, сколько по времени выполняется запрос к 1 сайту (тут поможет logging и метки времени) и на каком количестве запросов программа виснет).
    Ответ написан
    4 комментария
  • Как вставить в Telegraph картинку ссылкой по api?

    вставить любым способом картинку в Telegraph контент

    Можно, через тег img.

    есть ли возможность скрыть адрес сервера

    Нет, но можно загружать картинки на сервера телеграф.

    ограничить доступ к серверу только с Telegraph

    В теории можно, но лучше не надо. Проблема в том, что у телеграфа как бы несколько клиентов - веб версия и приложения на андроид и ios. Каждый из них можно определить (например в браузере есть referrer), но не факт, что это будет работать правильно и не сломается с каким-нибудь обновлением телеграмма.

    Но если очень хочется, настройте логи на сервере так, чтобы в них писалось как можно больше (как минимум все заголовки) и откройте вашу страницу в телеграфе разными способами (браузер, приложения), а затем откройте картинку отдельно от страницы. Сравните заголовки и определите, по каким можно фильтровать. Затем настройте фильтр в вашем веб-сервере.

    Если вы хотите организовать защиту от скачивания, то удачи вам. Твиттер (если я ничего не путаю) режет картинки на вертикальные полосы.
    Ответ написан
    Комментировать
  • Почему при json.dump() Json объекты не разделяются запятой?

    Скорее всего ваш код выполняется несколько раз. При многократном вызове json.dump() содержимое файла не очищается, новые данные просто дописываются в конец файла.
    Ответ написан
    Комментировать
  • Как написать скрипт на python, который будет делать скриншот определённых мест экрана?

    Можно сделать скриншот на устройстве через adb:
    adb shell screencap -p /sdcard/screen.png
    adb pull /sdcard/screen.png
    adb shell rm /sdcard/screen.png
    Ответ написан
    Комментировать
  • Что не так с моим кодом(Будильник)?

    Он выведет "Проснись!!!", если установить будильник на текущее время (т.е. чтобы он сработал сразу). А все потому, что надо в каждой итерации заново узнавать текущее время через what_time(), вместо сравнения с переменной t2

    def Alarm(t1, t2):
        while t1 != what_time():
          time.sleep(1)  
        print("Проснись!!!")


    И еще: хранить время в строках и все время сравнивать их не самое лучшее решение. Гораздо быстрее и удобнее хранить и сравнивать время как число.
    Ответ написан
    5 комментариев
  • Как работает __new__ в Python 3?

    __new__(cls, *args, **kwargs) - всегда classmethod. Вызывается для создания экземпляра класса, перед вызовом __init__. Новый экземпляр создается вызовом object.__new__(cls) (также вместо явного указания object можно использовать super()). Его должен вернуть __new__.
    Ответ написан
    Комментировать