Однозначно скачивать 5M веб-страниц за один раз - не очень хорошая идея, потому что вы сможете максимально использовать множество возможностей, включая пропускную способность сети и файловые дескрипторы вашей ОС. Я бы пошел партиями по 100-1000. Вы можете использовать urllib.urlopen, чтобы получить сокет, а затем просто прочитать () в нескольких потоках. Вы можете использовать select.select. Если это так, тогда загрузите все 1000 сразу и раздайте каждый дескриптор файла, который выбирает, возвращая, скажем, 10 рабочих потоков. Если выбор не сработает, ограничьте количество загрузок до 100 загрузок и используйте один поток для каждой загрузки. Конечно, вы не должны запускать более 100 потоков, так как ваша ОС может взорваться или, по крайней мере, работать медленно.