Python/Urllib2/Threading: Single download thread быстрее, чем несколько потоков для скачивания. Зачем?

Я работаю над проектом, который требует от меня создания нескольких потоков для загрузки большого удаленного файла. Я уже делал это, но я не могу понять, хотя для загрузки файла с несколькими потоками требуется больше времени, чем при использовании только одного потока. Я использовал мой xampp localhost для выполнения прошедшего времени теста. Я хотел бы знать, если это нормальное поведение или это потому, что я не пробовал скачивать с реального сервера.

Спасибо Кеннеди

Ответ 1

9 женщин не могут объединяться, чтобы сделать ребенка в течение одного месяца. Если у вас есть 10 потоков, у каждого из них есть только 10% пропускной способности одного потока, и есть дополнительные накладные расходы для переключения контекста и т.д.

Ответ 2

Python threading использует что-то, чтобы вызвать GIL (Golbal Interpreter Lock), который когда-то ухудшает время выполнения программ.

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

Надеюсь, это поможет:)

Ответ 3

Twisted использует неблокирующий ввод-вывод, это означает, что если данные сейчас недоступны в сокете, он не блокирует весь поток, поэтому вы можете обрабатывать многие соединения сокетов, ожидая ввода-вывода в одном потоке одновременно. Но если вы делаете что-то другое, чем I/O (разбор больших объемов данных), вы все равно блокируете поток.

Когда вы используете модуль сокета stdlib, он блокирует ввод-вывод, это означает, что когда вы вызываете socket.read, и данные недоступны в данный момент - он блокирует весь поток, поэтому вам нужен один поток на соединение для обработки параллельной загрузки.

Это два подхода к concurrency:

  • Вставить новую цепочку для нового подключения (threading + socket из stdlib).
  • Мультиплексный ввод-вывод и дескриптор могут подключаться в одном потоке (Twisted).