多线程请求 Python3

问题描述 投票:1回答:1

我在这个问题上研究了很多,但问题是我无法理解如何使用python3发送多线程post请求。

names = ["dfg","dddfg","qwed"]

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

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

python-3.x python-requests python-multithreading
1个回答
2
投票

解决方案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).

未来的对象可以让你更好地控制所收到的响应,比如是否正确完成或有异常或超时等。 更多关于 此处

您不会承担与以下问题有关的风险 络绎不绝 (解决方案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) 是为了使第一个参数重复创建相同数量的线程。

names 的第二个参数。requests.post 所以它将不需要明确地使用可选参数 data. 它的len必须与正在创建的线程数相同。

如果你需要调用另一个参数,比如一个可选的参数,这段代码将无法工作。

© www.soinside.com 2019 - 2024. All rights reserved.