我在这个问题上研究了很多,但问题是我无法理解如何使用python3发送多线程post请求。
names = ["dfg","dddfg","qwed"]
for name in names :
res = requests.post(url,data=name)
res.text
在这里,我想发送所有这些名字,并且我想使用多线程来使它更快。
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)
.
未来的对象可以让你更好地控制所收到的响应,比如是否正确完成或有异常或超时等。 更多关于 此处
您不会承担与以下问题有关的风险 络绎不绝 (解决方案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)
是为了使第一个参数重复创建相同数量的线程。
names
的第二个参数。requests.post
所以它将不需要明确地使用可选参数 data
. 它的len必须与正在创建的线程数相同。
如果你需要调用另一个参数,比如一个可选的参数,这段代码将无法工作。