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
).