Что значит потоки на закачку
Если ли смысл скачивать файлы в нескольких потоках?
Планирую сделать скачивание файлов.
Например, нужно скачать 9 файлов. Стоит ли их скачивать в 3 потоках или в одном?
2 ответа 2
Однако если вы планируете сохранять скачанные файлы на диске, то надо понимать, что диск практически не параллелится. Какое-то ускорение вы получите, но нужно экспериментировать.
Если память позволяет, я бы максимально параллелизовал скачивание файлов в память, а затем установил небольшую степень параллелизации для сохранения на диск.
Скорее всего нет. Если Ваш канал «уже» скорости, которую может отдать сайт, то хоть в 100 потоков качай, скорость не прибавить. Но некоторые сервера ограничивают скорость скачки для одного файла и при этом ограничивают ее сильно. В этом случае скачивать нескольких файлов одновременно может принести пользу (до тех пор, пока канала хватает). Если файлы качаются с разных серверов и Ваш канал явно шире возможности серверов, тогда есть смысл качать в несколько потоков (но по потоку на файл). Но при этом, главное не уперется в скорость диска.
Эта вся шумиха с закачкой файлов пошла с тех времен, когда интернет был медленный и тяжелый. Когда tcp/ip стек работал плохо. Был спутниковый интернет (да и мобильный который назывался CDS), который в один поток не мог пустить больше определенной скорости (от 2400 до 9600). Но таких потоков могло быть много. И вот в этом случае скачка в много потоков давала реальное ускорение.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками многопоточность загрузка или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.13.40988
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Многопоточное скачивание файлов с ftp python-скриптом
Зачем это нужно?
Однажды передо мной встала задача копирования большого количества файлов с ftp-сервера. Нужно было делать бэкап. Казалось бы, что может быть проще! Но увы, ничего готового работающего так же быстро для моих условий найти не удалось.
Ситуация
Нужно было забирать периодически пару сотен файлов с ftp-сервера под Windows. Много мелочи и несколько очень крупных по размеру файлов. Суммарно примерно на 500 Гб. Сервер представляет собой vps, расположенный довольно далеко за рубежом. Днем машина высоко нагружена, рано ночью выполняются регламентные работы, итого на скачивание часов 5 максимум.
Ни одна из рассмотренных мной утилит не смогла справиться качественно и за отведенное время. Ну что ж, деваться некуда, нормальную систему резервного копирования ещё не купили, а значит ноги в руки вооружаемся редактором или IDE Python и вперёд! За приключениями!
Конфиг
Все параметры для скрипта вынесем в отдельный файл для удобства.
В начале был список
Скачать файлы с ftp сама по себе задача не сложная, но путём недолгих экспериментов было выяснено, что скачивание файлов занимает время, а таймаут ftp-соединения приходит к нам гораздо быстрее. Следовательно, качать нужно каждый файл в новом соединении, иначе велик риск чего-то потом не досчитаться в скачанных файлах.
Для этого нам нужен список этих самых файлов. Ни о каком статичном списке файлов, конечно, речи не идет, значит нам его при каждом выполнении скрипта получать с сервера по-новой.
Параметры берутся из конфига. Конечно же в нужно не забыть импортировать библиотеку ftplib, чтобы этот кусок заработал.
Список файлов с сервера мы получим с помощью следующего класса:
Помимо методов соединения с сервером, получения списка файлов и определения его длины здесь имеет метод, который возвращает нам следующий файл для скачивания, из списка он при этом, конечно, удаляется.
Логирование
Для ведения логов скачивания будет использовать стандартную библиотеку logging. Создадим класс, который будет заниматься логированием.
Скрипт будет поддерживать просто логирование в файл и ротацию файловых логов, ибо логи имеют свойство расти непомерно и это надо бы держать под контролем.
Скачивание файла
Каждый файл будет скачиваться в отдельном потоке. Класс, скачивающий один конкретный файл с сервера выглядит следующим образом:
Для подсчета количества одновременно скачиваемых файлов мы будет использовать свойство класса count. В нём у нас будет количество существующих экземпляров класса: в конструкторе счетчик наращивается, в деструкторе, соответственно, уменьшается.
При сохранении списка файлов скрипт сохраняет также путь до этого файла, этот путь мы воссоздаем при скачивании с помощью os.makedirs.
Статус-файл
Класс для работы с этим файлов выглядит так:
Многопоточность
Ну и, наконец, сама основная функция скрипта, которая осуществляет работу с потоками скачивания:
Здесь мы запускаем логирование, получаем список файлов ( он хранится в памяти).
В вечном цикле while мы проверяем количество одновременно запущенных скачиваний и, при необходимости, запускаем дополнительные потоки.
Что значит потоки на закачку
смотря что подразумевается под «лучше»
так как ширина дырочки в инет одинаковая для всех случаев, то монопенисуально сколько потоков. Кроме того думается что полезный траффик(данные) в случае с несколькими программными потоками будет меньше, так как для этих самых левых потоков будет больший оверхед чем для одного потока.
—
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
Prohodil Mimo © ( 2005-01-21 13:24 ) [3]
но в несколько потоков обычно быстрее скачивается
← →
Kerk © ( 2005-01-21 13:25 ) [4]
На серваке может быть установлен лимит скорости на соединение. Т.е. при одинаковой ширине дырочки несколько потоков скачают файл быстрее.
> 1008 © (21.01.05 13:04)
Если сервер может отдать больше чем ты принять то в один поток. Если сервер каждой закачке скажем отдает максимум 1Kb, а у тебя канал потолще то вероятно быстрее скачается в несколько потоков.
да, также у тебя локально может быть обрезана скорость для одной закачки, тогда тоже лучше в несколько 🙂
← →
КаПиБаРа © ( 2005-01-21 13:35 ) [7]
1008 © (21.01.05 13:04)
Как его качать лучше
Конечно же в один поток. Тут двух мнений быть не может.
← →
Kerk © ( 2005-01-21 13:37 ) [8]
КаПиБаРа © (21.01.05 13:35) [7]
Тут двух мнений быть не может.
Ты видимо веткой про религию обчитался. 🙂
← →
КаПиБаРа © ( 2005-01-21 13:45 ) [9]
Kerk © (21.01.05 13:37) [8]
Мнения могут быть, но качать нужно в одном потоке.
Digitman © (21.01.05 13:18) [1]
NailMan © (21.01.05 13:22) [2]
Пожалуй это довольно полиписуально, т.к. DuMeter (кажется так назывался этот мониторчик) мою загрузку (при одном файле) показывал в виде пиков: снижение скорости (почти до нуля) и её возрастание до максимума (причём только я в нете). То есть можно более одного.
← →
Piter © ( 2005-01-21 14:31 ) [11]
NailMan © (21.01.05 13:22) [2]
так как ширина дырочки в инет одинаковая для всех случаев, то монопенисуально сколько потоков
неверно.
Это так только потому, что в большинстве случае скорость сервера БОЛЬШЕ, чем скорость клиента.
А если наоборот, то не все так просто. Допустим, сервер делит скорость поровну между пользователями.
Реально все конечно сложнее, но думаю идею я донес.
Другое дело, что зачастую серверы, которые предоставлят что-то тяжелое (фильмы, бесплатную музыку) ограничивают закачку N потоками (зачастую N=1). И если начинаешь качать в большее число потоков, то просто банят, тут вообще у тебя скорость 0 будет 🙂
Что значит потоки на закачку
Вот меня мучает вопрос. Правда что если обьемный файл закачивать через загрузчик при этом ставить закачку в несколько потоков, то процесс пойдет быстрее.
1. Правда что при нескольких потоках закачка проходит быстрее.
2. Сколько потоков работает быстрее.
3. И есть ли экономия трафика.
Короче раскажите про потоки как можно подробней. Мне кажется эта инфа будет очень интересной.
TERMIN2783@Friday, 10 November 2006, 20:43
QUOTE |
1. Правда что при нескольких потоках закачка проходит быстрее. |