Добрый день, уважаемые жители Хабра! Сегодня мы поговорим о том, как из идеи измерения скорости был создан скрипт, который загружает файл изображения и отправляет его обратно на сервер, вычисляя время выполнения каждой функции и вычисляя скорость.
Начну со списка используемых библиотек:
- импортировать ОС
- из пула многопроцессорного импорта
- время импорта
- импортировать панд как 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 #разработка #скрипты #измерения
-
Контакт Через Бесконтактные Карты
19 Oct, 24 -
Почему Я Сменил Работу?
19 Oct, 24 -
Зачем Программисту Учить Юзабилити?
19 Oct, 24 -
Правила Высокой Производительности
19 Oct, 24 -
Перегрузка Метода В Php?
19 Oct, 24