Проверка Скорости Интернета С Помощью Библиотеки Requests В Многопроцессорности

Добрый день, уважаемые жители Хабра! Сегодня мы поговорим о том, как из идеи измерения скорости был создан скрипт, который загружает файл изображения и отправляет его обратно на сервер, вычисляя время выполнения каждой функции и вычисляя скорость.

Начну со списка используемых библиотек:

  • импортировать ОС
  • из пула многопроцессорного импорта
  • время импорта
  • импортировать панд как pd
  • запросы на импорт
Далее нам понадобится список серверов, я предпочел для этого создать словарь:
  
  
  
  
  
   

server_list = [ { 'server_id': 3682, 'download': ' http://moscow.speedtest.rt.ru:8080/speedtest/random7000x7000.jpg ', 'upload': ' http://moscow.speedtest.rt.ru:8080/speedtest/upload.php ' } ]

Напишем первую функцию:

def download(id, path): start = time.time() file_name = str(id) + str(path.split('/')[-1]) try: r = requests.get(path, stream=True, timeout=5) except: return 0 size = int(r.headers.get('Content-Length', 0)) with open(file_name, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk) end = time.time() duration = end - start sp = (((size * 8) / 1024) / 1024) / duration return sp

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

В имени файла пишем id сервера и имя образа (это сделано для того, чтобы не было конфликтов при скачивании из нескольких источников).

Далее делаем GET-запрос, получаем размер файла (в байтах) и сохраняем его на диск.

Конвертируем байты в биты, еще немного магии с формулами и на выходе имеем скорость в МБит/с.

Следующая функция — загрузка файла на сервер:

def upload(id, path): start = time.time() file_name = str(id) + 'random7000x7000.jpg' with open(file_name, 'rb') as f: files = {'Upload': (file_name, f.read())} try: requests.post(path, files=files) except: return 0 size = os.path.getsize(file_name) end = time.time() duration = end - start sp = (((size * 8) / 1024) / 1024) / duration return sp

Здесь принцип тот же, только берем файл из локальной папки и отправляем его POST-запросом.

Наша следующая задача — получить данные из двух предыдущих функций.

Напишем еще одну функцию:

def test_f(conn, server): speed_download = download(server['server_id'], server['download']) speed_upload = upload(server['server_id'], server['upload']) return server['server_id'], speed_download, speed_upload

Осталось только присоединить многопроцессорность с пулом и параллельную функцию карта :

def main(): pool = Pool() data = pool.map(test_f, server_list) df = pd.DataFrame(data, columns=['Server', 'Download', 'Upload']) print(df) pool.close() pool.join()



if __name__ == '__main__': main()

Скрипт готов к использованию, для удобства вывода я использовал библиотеку pandas. Результаты также можно поместить в базу данных и собрать статистику для анализа.

Спасибо за внимание! UPD: Исправлены исключения, внесены изменения в работу многопроцессорности (заменен цикл на параллельную функцию), добавлен таймаут на GET запрос Теги: #python #разработка #скрипты #измерения

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.