多线程请求 Python3

Multi Thread Requests Python3

我对这个主题进行了很多研究,但问题是我无法弄清楚如何使用 python3

发送多线程 post 请求
names = ["dfg","dddfg","qwed"]

for name in names :
    res = requests.post(url,data=name)
    res.text 

这里我想发送所有这些名字,我想使用多线程来让它更快。

解决方案 1 - concurrent.futures.ThreadPoolExecutor固定线程数

使用自定义函数 (request_post) 您几乎可以做任何事情。

import concurrent
import requests

def request_post(url, data):
    return requests.post(url, data=data)

with concurrent.futures.ThreadPoolExecutor() as executor: # optimally defined number of threads
    res = [executor.submit(request_post, url, data) for data in names]
    concurrent.futures.wait(res)

res 将是 request.Response 的列表,每个请求都包含在 Future 个实例上。要访问 request.Response,您需要使用 res[index].result(),其中 index 大小为 len(names)

Future 对象可让您更好地控制收到的响应,例如它是否正确完成或出现异常或超时等。更多关于 here

您不会冒与 high number of threads(解决方案 2)相关的问题的风险。


解决方案 2 - multiprocessing.dummy.Pool 并为每个请求生成一个线程

如果您请求的页面不多,或者响应时间很慢,可能会有用。

from multiprocessing.dummy import Pool as ThreadPool
import itertools
import requests

with ThreadPool(len(names)) as pool: # creates a Pool of 3 threads 
    res = pool.starmap(requests.post(itertools.repeat(url),names))

pool.starmap - 用于将 (map) 多个参数传递给将由线程列表调用的一个函数 (requests.post) (ThreadPool)。对于每个请求,它将 return 列表 request.Response

需要

intertools.repeat(url) 才能使第一个参数重复创建的线程数相同。

namesrequests.post 的第二个参数,因此无需显式使用可选参数 data 即可工作。它的 len 必须与正在创建的线程数相同。

如果您需要调用另一个参数(如可选参数),此代码将不起作用