Параллельные запросы GET для разных доменов с модулем потоков - PullRequest
0 голосов
/ 21 января 2019

Я ожидаю получить что-то вроде 100 тыс. URL-адресов из разных доменов.Я написал этот код, который имеет список URL-адресов в all_urls и формирует потоки N для запуска в одном пакете.В настоящее время я использую модуль threading для параллельного выполнения этих запросов.

import requests
import os
import threading
import time

all_urls = [] # a list of URLs to request, can have up to 100k

global success, fail
success = 0
fail = 0

def func(url_to_request):
    global success, fail
    try:
        r = requests.get(url_to_request, timeout=5)
        c = r.content
        success = success +1
    except:
        fail = fail +1
    return

batch_count = 1
N = 200 # number of threads
all_threads_urls = []
time_start = time.time()

for item in all_urls:
    all_threads_urls.append(item)
    if all_urls.index(item) == len(all_urls)-1 or len(all_threads_urls) == N:
        # call it
        all_threads = []
        for link in all_threads_urls:
            current_thread = threading.Thread(target=func, args=(link,))
            all_threads.append(current_thread)
            current_thread.start()

        for thr in all_threads:
            thr.join()

        all_threads_urls = [] # for the next batch
        time_end = time.time()

        print "Request number", all_urls.index(item)+1, "Good:", success, "Bad:", fail, "Duration:", round(time_end - time_start,2 ), "seconds."
        time_start = time_end

Результаты для этого немного странные, кажется, что скрипт запускается очень быстро, но затем сильно замедляется (см. Изображение).Продолжительность печати указана для каждой партии.enter image description hereМожет кто-нибудь объяснить, что здесь является узким местом?Может быть, есть лучший модуль для этого или нет пути к этому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...