Разница в использовании grequests с порциями адресов или со всеми сразу?

#python #http #grequests

#python #http #grequests

Вопрос:

Я пытаюсь загрузить /home.htm файл, содержащий около 6000 http-адресов. Для ускорения я попытался использовать grequests для отправки их всех сразу, но я получаю только около 200 ответов, большинство из них выдает ошибку «отказано в подключении». Когда я разбиваю адреса на порции по 100, а затем отправляю каждый фрагмент отдельно, мне отвечают около 1200 адресов (= загрузка их /home.htm прошло успешно), даже если я использую те же адреса, что и раньше.

Я запускаю его с помощью Python3.6 в Ubuntu 16.04.

 import grequests
import requests
import sys
import os
import resource

# Counts exceptions and prints them
def exceptionh(request, exception):
...

# Yields succesive n-sized chunks
def make_chunks(req, n):
    for i in range(0, len(req), n):
         yield req[i:i n]

def run(ipport):
    # Make http links
    http_links = []
    for ip in ipport:
        http_links.append('http://'   ip.strip()   '/home.htm')

    # changing limit, without it there are too many Errno24 Exceptions
    resource.setrlimit(resource.RLIMIT_NOFILE, (131072, 131072))

    # Request making
    rq = []
    ctr = 0
    for link in http_links:
        rq.append(grequests.get(link, timeout=30, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'}, stream=False))
        ctr  = 1
    rq = list(make_chunks(rq, 100))
    # Send requests
    results = []
    for chunk in rq:
        results.append(grequests.map(chunk, exception_handler=exceptionh))

    # Save .html
    for chunk in results:
        for response in chunk:
            if response is not None:
                # write it in html file
  

Как я описал выше, результаты отличаются. Когда я отправляю запросы порциями, я получаю больше результатов, чем когда я отправляю все сразу.
Почему это? Есть ли лучший подход к этой проблеме?