gpt4 book ai didi

python-3.x - 多线程请求 Python3

转载 作者:行者123 更新时间:2023-12-03 13:16:44 27 4
gpt4 key购买 nike

我对这个主题进行了很多研究,但问题是无法弄清楚如何使用 python3 发送多线程发布请求

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 - 用于将多个参数传递(映射)到一个函数( requests.post ),该函数将被线程列表( ThreadPool )调用。它将返回一个列表 request.Response 对于每个请求。 intertools.repeat(url)需要使第一个参数重复创建相同数量的线程。 namesrequests.post 的第二个参数所以它不需要显式使用可选参数 data 就可以工作.它的 len 必须与正在创建的线程数相同。
如果您需要调用另一个参数(如可选参数),则此代码将不起作用

关于python-3.x - 多线程请求 Python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62007674/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com