Задать вопрос
  • Чем обусловлена такая разница в асинхронной обработке запросов?

    @lega
    1) Отличие этих 2-х результатов это "Data transferred:", второй вариант передал в 10 раз больше данных, значит больше работы - меньше rps - т.е. тесты не эквивалентны

    2) если вам не надо ждать результат то не используйте await, тогда завершить запрос можно будет быстрее

    в целом create_task не даст вам большую производительность, а асинхронный вызов не может занимать ни 3 ни 7 сек, скорее у вас код блокирующий или тормозной, и ни asyncio ни aiohttp тут не причем.

    PS: asyncio + uvloop могут выдавать до 100к rps на среднем ноутбуке в один поток, поэтому не это причина ваших 150rps

    --- тест asyncio + uvloop + httptools на среднем ноутбуке
    Результат: 123krps, и max latency 6.74ms

    Запуск wrk:
    $ docker run --rm -it --network=host williamyeh/wrk -c 200 -d 10 http://localhost:8888/

    Результат:
    Running 10s test @ http://localhost:8888/
      2 threads and 200 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     1.59ms  404.50us   6.74ms   58.61%
        Req/Sec    62.18k     7.51k   74.02k    68.00%
      1237743 requests in 10.06s, 47.22MB read
    Requests/sec: 123044.52
    Transfer/sec:      4.69MB

    import asyncio
    import uvloop
    from httptools import HttpRequestParser
    
    class RpcProtocol(asyncio.Protocol):
        def connection_made(self, transport):
            self.transport = transport
            self.parser = HttpRequestParser(self)
    
        def connection_lost(self, exc):
            self.transport = None
    
        def data_received(self, data):
            self.parser.feed_data(data)
    
        def on_message_complete(self):
            #if self.url == b'/hello':
            response = b'HTTP/1.1 200 OK\nContent-Length: 5\n\nHello'
            self.transport.write(response)
    
            if not self.parser.should_keep_alive():
                self.transport.close()
                self.transport = None
    
    if __name__ == '__main__':
        loop = uvloop.new_event_loop()
        asyncio.set_event_loop(loop)
        coro = loop.create_server(RpcProtocol, '127.0.0.1', 8888)
        loop.run_until_complete(coro)
        loop.run_forever()
        loop.close()
    Ответ написан
  • Python.Импорт в нужное время.Модификация скрипта.Как мне быть?

    @lega
    1) можно перезагрузить модуль: 3.4+ importlib.reload
    2) можно запускать скрипт через subprocess с запаковой -> распаковкой (например через pickle)
    3) хранить в json/hjson/json5/yaml и т.п.
    Ответ написан
    1 комментарий
  • Есть ли смысл использовать Pool на одноядерном процессоре?

    @lega
    Есть ли смысл использовать Pool на одноядерном процессоре?
    Есть, процессы можно добавлять пока CPU потребляет менее 100% (либо пока не упрется в io/сеть/диск)
    Ответ написан
    Комментировать
  • Какова реальная сфера применения MongoDb?

    @lega
    Монга перекрывает 80-90% функционала sql-баз если рассмартивать средний проект, но дополнительно дает бо'льшую скорость работы, скорость и гибкость разработки, ну и масштабирование из коробки.
    А от хейтеров вы осбо хорошего и не услышите ;-)

    Ведь в блоге есть автор, у которого есть статьи, которые в свою очередь связаны с категориями, тегами и т.д. А еще у статей есть комментарии.
    Категории, теги, да и сам автор может быть уже на клиенте, особенно если это веб-приложение, в этом случае реляции не обязательно подгружать, таким образом идет экономия поиска/чтения из базы и меньше трафика для передачи клиенту - т.е. выше производительность.
    Так же автор может быть продублирован в документе (завсисит от задачи) и на крайний случай есть lookup и подобные способы.
    Комментарии так же могут быть сохранены в самом документе, таким образом вы читаете из базы всего 1 документ, а не тысячу, что увеличивает скорость "на порядки".

    Так же гибкость с надежностью - на каждую операцию вы выбираете использовать транзакцию или атомарность, кол-во реплик для сохранения т.п. что дает повышенную производительность.

    Вообщем если нужна гибкость и скорость - то попробуйте монгу.
    Ответ написан
  • Почему меняется аргумент функции?

    @lega
    Metalofon NT
    А когда ты, к примеру, передаёшь число, передаётся именно число, а не ссылка на число

    Питон всегда передает ссылку, просто в первом примере вы не меняете ссылку в переменной arr.append(1) - а меняете содержимое объекта по ссылке (в питоне считается все - есть объект), в во втором примере вы как раз заменяете ссылку в переменной arr = 1, т.е. переменная arr будет уже ссылаться на другой объект (хотя есть некое исключение с кешированием но не в этом случае).
    Ответ написан
    Комментировать
  • На ноутбуке не печатаются английские буквы, это конец?

    @lega
    у клавиатуры нет раскладки - это фича ОС, а в биос не можете войти потому что не правильно вводите пароль (либо некоторые кнопки перестали работать)

    на крайний случай можете переустановить линух с англ. язвком, а русскую раскладку уже доустановить
    Ответ написан
    Комментировать
  • Как преобразовать цикл в строку?

    @lega
    for i in range(1, 6):
      str(i)
    Ответ написан
    Комментировать
  • Какое рабочее окружение лучше подобрать на python?

    @lega
    Для отладки можете воспользоваться pudb
    Ответ написан
    Комментировать
  • Как до записать json python?

    @lega
    самое простое - загрузить, поправить и сохранить
    json.load
    Ответ написан
    Комментировать
  • Как можно преобразовать такую строку в словарь?

    @lega
    dict(map(lambda x:x.split(':'), text1.split(',')))
    Ответ написан
    Комментировать
  • Что я делаю не так с proc.stdout.read()?

    @lega
    блокирующий вариант py-my.ru/post/4bfb3c691d41c846bc000061
    async вариант py-my.ru/2018/05/01/asyncio_subprocess.html

    > ['%s' %file_read_temp], shell=True
    1) список и shell=True, - нужно использовать что-то одно, либо список, либо строка + shell=True
    2) выражение должно быть запускаемым
    3) см. proc.stderr.read() какую ошибку выдает, либо можно перенаправить stderr->stdout, так же может проверить что в proc.returncode
    Ответ написан
    Комментировать
  • Что выбрать. http параметры или body?

    @lega
    Я предпочитаю однотипные запросы (без бардака с put/patch и аргументами и с body, хотя кто-то называет это best-practice)
    Т.е. я стараюсь всегда использовать post + json в body - т.к. покрывает почти все случаи.
    И иногда get с аргументами - когда нужно кеширование.
    Ответ написан
    Комментировать
  • Max возвращает неверное значение, почему?

    @lega
    max(map(int, a))
    Ответ написан
    Комментировать
  • Почему убивается процесс демона MongoDB?

    @lega
    Загляните в syslog, возможно это oom-killer убивает могу когда та начинает жрать всю память (если так - то нехватка памяти), так же ещё сделайте swap если ещё нету (а если есть, что показывает?).
    Ответ написан
    2 комментария
  • Array of embedded documents vs Foreign key?

    @lega
    Вывод: если требуется фильтровать по полям вложенных док-ов, то стоит реализовать коллекции не как вложенные, а в виде отдельной коллекции, как в РБД.
    Чаще да. Так же бывают такие варианты как пометить определенных пользователей чтобы всех не перебирать, либо дублировать "отличительные" комментарии в отдельную коллекцию или наоборот дублировать в "документ пользователя", в nosql оно гибче.

    N * LogM. То есть нужно просмотреть каждого пользователя - N итераций
    Чтобы не делать N итераций используют индекс, чтобы получить нужные документы без переборов (а переборы задействуют "диск").

    Так же тут нужно смотреть на то как вы будете изменять поле "количество просмотров", если комментарии находятся в отдельной коллекции - то это будет проще и быстрее.

    Comments будет иметь N * M док-ов, а сложность будет Log( N * M ).
    Откуда у вас тут Log? Чтобы получить "все комментарии имеющие 200 просмотров.", коллекцию пользователей трогать вообще не обязательно.
    Ответ написан
  • Не получается собрать Python 3.7 из официальных исходников?

    @lega
    1) Похоже что нехватает некоторых пакетов в системе (libffi-dev?), это гуглится за секунды
    2) "make install" не желательно делать, предпочтительнее сделать deb пакет (в случае ubuntu/debian), который ктому же можно будет ставить и на другие хосты.
    3) Нельзя "подменять" стандартный питон, т.к. система может перестать грузится, нужно ставить параллельно.
    4) Что-бы использовать любую версию питона не обязательно её ставить, можно запустить через docker: "docker -it run python:3.7"
    5) Я использую эту инструкцию уже более 7 лет для сборки разных версий питона под разные версии ubuntu (всегда работает), дополнительно я делаю сборку внутри докера, чтобы не захламлять основную систему.
    Ответ написан
    Комментировать
  • Почему не правильно работает?

    @lega
    >>> max(list('1736'))
    '7'
    Ответ написан
    Комментировать
  • Почему Load Average > 2000 на нормально работающем сервере?

    @lega
    Любой процесс может выставить статус "блокирован", обычно когда обращается к диску или другое IO, ядро это учитвает при расчете loadAverage, в итоге если какое-то приложение выставило этот статус и оставило его висеть, то loadAverage будет расти.
    Поищите процессы со статусом D (например через ps aux), в теории у вас должно быть не менее 7 таких процессов.
    Ответ написан
    1 комментарий
  • Как получить текст из всех тeгов 'p'?

    @lega
    >>> html = '<html><div><p>hello world 1</p></div><div><p>hello world 2</p></div> </html>'
    >>> re.findall(r'<p>([^<]+)</p>', html)
    ['hello world 1', 'hello world 2']
    Ответ написан
    Комментировать