使用 Python3 发送 100,000 个 Web 请求的最快方法是什么?

问题描述

我有大约 100,000 个 URL 列表。所有都在同一个域中,并具有不同的子目录。 检查此 100,000 个 URL 列表的状态代码的最快方法是什么? 我目前正在使用线程和 PyCurl 发出请求,如下所示。如何更有效地创建线程并更快地发出 Web 请求?

import pycurl
import certifi

from threading import Thread

def req(url,counter):
    try:
        curl = pycurl.Curl()
        curl.setopt(pycurl.CAINFO,certifi.where())
        curl.setopt(pycurl.WRITEFUNCTION,lambda x: None)
        curl.setopt(pycurl.CONNECTTIMEOUT,5)
        curl.setopt(pycurl.URL,url)
        curl.perform()
        print(f"Requests: {counter} | URL: {url} | Status Code: {curl.getinfo(pycurl.HTTP_CODE)}")
        curl.close()

    except pycurl.error:
        pass

with open("urllist.txt") as f:
    urls = f.read().splitlines()

counter = 0

while True:
    for url in urls:
        counter += 1
        Thread(target=req,args=(url,counter,)).start()

补充说明,你提出了一个类似的问题,所以我把它链接起来了。

我实际上尝试过这个,而且速度非常快。也许这是最快的“在请求部分”,但它是第一个准备过程吗? 这需要很多时间。

解决方法

您想研究 curl 的多接口,它在同一线程上进行并发传输。即使有 10 万个请求,您也受 I/O 限制。使用多接口后,您可以通过上述内部线程将工作负载分配到更多线程实例中,或者只是启动单独的进程(如果您使用的是 Linux,请参阅 xargs -P 或 GNU Parallel)。