статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Асинхронный и синхронный анализ производительности Python
Введение Эта статья является второй частью серии статей об использовании Python для разработки асинхронных веб-приложений. В первой части более подробно рассматривается параллелизм в Python и asyncio, а также aiohttp. Если вы хотите узнать больше об асинхронном Python для веб-разработки [/ asynchronous-python-for-web-development /], у нас это есть. Из-за неблокирующей природы асинхронных библиотек, таких как aiohttp, мы надеемся, что сможем делать и обрабатывать больше запросов в
Время чтения: 8 мин.
Вступление
Эта статья является второй частью серии об использовании Python для разработки асинхронных веб-приложений. В первой части более подробно asyncio параллелизм в Python и asyncio, а также aiohttp .
Если вы хотите узнать больше об асинхронном Python для веб-разработки , у нас это есть.
Из-за неблокирующей природы асинхронных библиотек, таких как aiohttp мы надеемся, что сможем делать и обрабатывать больше запросов за заданный промежуток времени по сравнению с аналогичным синхронным кодом. Это связано с тем, что асинхронный код может быстро переключаться между контекстами, чтобы минимизировать время ожидания ввода-вывода.
Ты неправильно замеряешь время в Python! Или нет?
Клиентская и серверная производительность
Тестирование производительности асинхронной библиотеки, такой как aiohttp стороне клиента относительно несложно. Мы выбираем какой-либо веб-сайт в качестве ссылки, а затем делаем определенное количество запросов, определяя, сколько времени потребуется нашему коду для их выполнения. Мы рассмотрим относительную производительность aiohttp и requests при отправке запросов на https://example.com .
Проверить производительность на стороне сервера немного сложнее. Такие библиотеки, как aiohttp поставляются со встроенными серверами разработки, которые подходят для тестирования маршрутов в локальной сети. Однако эти серверы разработки не подходят для развертывания приложений в общедоступной сети, поскольку они не могут справиться с нагрузкой, ожидаемой от общедоступного веб-сайта, и не подходят для обслуживания статических ресурсов, таких как Javascript, CSS и файлы изображений.
Чтобы получить лучшее представление об относительной производительности aiohttp и аналогичной синхронной веб-инфраструктуры, мы собираемся повторно реализовать наше веб-приложение с помощью Flask, а затем сравним серверы разработки и производства для обеих реализаций.
Для производственного сервера мы будем использовать Gunicorn .
На стороне клиента: aiohttp vs запросы
Для традиционного синхронного подхода мы просто используем простой цикл for Однако перед запуском кода обязательно установите модуль запросов :
$ pip install —user requests
Разобравшись с этим, давайте продолжим и реализуем это более традиционным способом:
# multiple_sync_requests.py import requests def main(): n_requests = 100 url = «https://example.com» session = requests.Session() for i in range(n_requests): print(f»making request to «) resp = session.get(url) if resp.status_code == 200: pass main()
Однако аналогичный асинхронный код немного сложнее. Выполнение нескольких запросов с помощью aiohttp использует asyncio.gather для одновременного выполнения запросов:
Расчёт времени выполнения программы на python #short
# multiple_async_requests.py import asyncio import aiohttp async def make_request(session, req_n): url = «https://example.com» print(f»making request to «) async with session.get(url) as resp: if resp.status == 200: await resp.text() async def main(): n_requests = 100 async with aiohttp.ClientSession() as session: await asyncio.gather( *[make_request(session, i) for i in range(n_requests)] ) loop = asyncio.get_event_loop() loop.run_until_complete(main())
Запуск синхронного и асинхронного кода с помощью утилиты bash time:
[email protected] :~$ time python multiple_sync_requests.py real 0m13.112s user 0m1.212s sys 0m0.053s [email protected] :~$ time python multiple_async_requests.py real 0m1.277s user 0m0.695s sys 0m0.054s
Параллельный / асинхронный код намного быстрее. Но что произойдет, если мы сделаем синхронный код многопоточным? Может ли он соответствовать скорости параллельного кода?
# multiple_sync_request_threaded.py import threading import argparse import requests def create_parser(): parser = argparse.ArgumentParser( description=»Specify the number of threads to use» ) parser.add_argument(«-nt», «—n_threads», default=1, type=int) return parser def make_requests(session, n, url, name=»»): for i in range(n): print(f»: making request to «) resp = session.get(url) if resp.status_code == 200: pass def main(): parsed = create_parser().parse_args() n_requests = 100 n_requests_per_thread = n_requests // parsed.n_threads url = «https://example.com» session = requests.Session() threads = [ threading.Thread( target=make_requests, args=(session, n_requests_per_thread, url, f»thread_») ) for i in range(parsed.n_threads) ] for t in threads: t.start() for t in threads: t.join() main()
Выполнение этого довольно подробного фрагмента кода даст:
[email protected] :~$ time python multiple_sync_request_threaded.py -nt 10 real 0m2.170s user 0m0.942s sys 0m0.104s
И мы можем увеличить производительность, используя больше потоков, но отдача быстро уменьшается:
[email protected] :~$ time python multiple_sync_request_threaded.py -nt 20 real 0m1.714s user 0m1.126s sys 0m0.119s
Внедряя многопоточность, мы можем приблизиться к соответствию производительности асинхронного кода за счет увеличения сложности кода.
Хотя он предлагает аналогичное время отклика, оно того не стоит из-за усложнения кода, который может быть простым — качество кода не увеличивается из-за сложности или количества строк, которые мы используем.
На стороне сервера: aiohttp против Flask
Проверка скорости заргрузки сайта используя Python
Скорость загрузки сайта является одним из осоновных показателей для продвижения сайта, это показал последний апдейт Google. Каждый SEO специалист проводя аудит сайта старается максимально увеличить скорость загрузки, но как проверить страницы на скорость загрузки, можно использовать сторонние сервисы платные или бесплатные но с ограниениями или же прибегнуть к более альтернативным методам.
Проверить скорость загрузки каждой страницы вручную, довольно трудоемкая и неблагодарная работа. Встречаются и те, кто проверяет скорость загрузки только главной). И даже проверив основные страницы на скорость загрузки, хочется время от времени контролировать данную статистику, так как возможно вляние многих факторов на скорость и разработчик может сделать минимальные правки кода, а скорость загрузки уменьшится в несколько раз. Но заметить это можно не сразу, что приведет к проседанию позиций.
Python: как проверить скорость Интернета
Возможно, вы уже пользовались сайтом speedtest раньше, но знаете ли вы, что в speedtest есть библиотека Python.
В этом руководстве мы научимся использовать библиотеку Speedtest для проверки скорости вашего интернета. Мы также узнаем, как использовать командные строки speedtest. Давайте начнем.
Установка Speedtest
Чтобы установить speedtest через pip, выполните следующую команду:
pip install speedtest-cli
Тест скорости интернета (скрипт)
После установки пакета speedtest. Теперь давайте посмотрим, как использовать его с кодом. В следующем коде я проверю скорость загрузки в Интернете.
import speedtest # Speed test st = speedtest.Speedtest() # Download Speed ds = st.download() print(ds)
Позвольте мне объяснить.
Сначала мы импортируем пакет speedtest. Затем вызывается класс Speedtest() . Затем проверьте мою скорость загрузки с помощью метода download() . Наконец, распечатайте результат. Вывод:
3422459.073187817
Как видите, скорость интернета выражена в байтах . Чтобы сделать его читабельным, мы воспользуемся следующей функцией.
def humansize(nbytes): suffixes = [‘B’, ‘KB’, ‘MB’, ‘GB’, ‘TB’, ‘PB’] i = 0 while nbytes >= 1024 and i < len(suffixes)-1: nbytes /= 1024. i += 1 f = (‘%.2f’ % nbytes).rstrip(‘0’).rstrip(‘.’) return ‘%s %s’ % (f, suffixes[i]) #Readable print(humansize(ds))
3.56 MB
Теперь давайте проверим скорость загрузки с помощью метода upload() .
import speedtest # Speed test st = speedtest.Speedtest() # Upload speed us = st.upload() print(us) #Readable print(humansize(us))
386382.6586620888 301.51 KB
Командные строки Speedtest
Speedtest также предоставляет командные строки для проверки скорости нашего интернета.
Использование:
Команда помощи:
speedtest-cli -h
usage: speedtest-cli [-h] [—no-download] [—no-upload] [—single] [—bytes] [—share] [—simple] [—csv] [—csv-delimiter CSV_DELIMITER] [—csv-header] [—json] [—list] [—server SERVER] [—exclude EXCLUDE] [—mini MINI] [—source SOURCE] [—timeout TIMEOUT] [—secure] [—no-pre-allocate] [—version] Command line interface for testing internet bandwidth using speedtest.net.
Проверить скорость интернета:
speedtest-cli
Retrieving speedtest.net configuration. Testing from xxx Telecom (196.89.30.99). Retrieving speedtest.net server list. Selecting best server based on ping. Hosted by xxx Telecom (xxx) [394.57 km]: 29.1 ms Testing download speed. Download: 8.30 Mbit/s Testing upload speed.
Upload: 10.33 Mbit/s
Эта команда выше проверяет ping , скорость загрузки и скорость скачивания . Проверить скорость интернета: по ссылке для обмена:
speedtest-cli —share
Retrieving speedtest.net configuration. Testing from xxx Telecom (196.89.30.99). Retrieving speedtest.net server list. Selecting best server based on ping. Hosted by xxx Telecom (xxx) [394.57 km]: 28.131 ms Testing download speed.
Download: 3.74 Mbit/s Testing upload speed. Upload: 0.39 Mbit/s Share results: http://www.speedtest.net/result/12339819892.png
Как видите, у нас есть URL результатов. Откроем его в браузере. Результат: Надеемся, это легко понять. До скорого.
Использованная литература:
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
По статье задано0 вопрос(ов)
Подписка на обсуждение 1
Подписка на раздел 72
Вам это нравится? Поделитесь в социальных сетях!
Источник: evileg.com