多线程请求 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)
才能使第一个参数重复创建的线程数相同。
names
是 requests.post
的第二个参数,因此无需显式使用可选参数 data
即可工作。它的 len 必须与正在创建的线程数相同。
如果您需要调用另一个参数(如可选参数),此代码将不起作用
我对这个主题进行了很多研究,但问题是我无法弄清楚如何使用 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)
才能使第一个参数重复创建的线程数相同。
names
是 requests.post
的第二个参数,因此无需显式使用可选参数 data
即可工作。它的 len 必须与正在创建的线程数相同。
如果您需要调用另一个参数(如可选参数),此代码将不起作用