python - 使用 Python 发送数千个 post 请求的最快方法是什么?

标签 python http post

<分区>

我想以最快的方式发出数千个 POST 请求。我如何使用 Python 执行此操作?

到目前为止,我只有一个 for 循环,它多次调用以下函数:

def post(word):
    data = json.dumps({"word":word})
    url = "http://127.0.0.1:8000/updateword"
    req = urllib2.Request(url, data, {'Content-Type': 'application/octet-stream'})
    response=None
    try:
        f = urllib2.urlopen(req)
        response = f.read()
        f.close()
    except urllib2.HTTPError, error:
        k= open('error.html','w')
        k.write(error.read())
        k.close()
    return response

有更好的方法吗?

最佳答案

按照您编写代码的方式,它会等待对一个请求的响应,然后再发送下一个请求。 (最重要的是,它可能不会重用 HTTP 连接,这意味着您必须处理每个请求的套接字创建/关闭开销。然后,根据您正在测试的内容,很有可能实际上使它成为一个更好的测试。)

同时发出多个请求的最简单方法是使用线程。最简单的方法是使用 concurrent.futures (或 futures from PyPI ,如果您使用的是 2.x 或 3.1):

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
    results = pool.map(post, words)
    concurrent.futures.wait(results)

如果您愿意,您可以编写自己的线程,只给每个线程 1/10 的 words 并让它循环调用 post:

def posts(words):
    for word in words:
        post(word)

groupsize = len(words)/10
t = [threading.Thread(target=posts, args=[words[i*groupsize:(i+1)*groupsize]]
     for i in range(10)]
for thread in t:
    thread.start()
for thread in t:
    thread.join()

无论哪种方式,显然我只是凭空得出数字 10(因为它比大多数浏览器或 Web 服务客户端允许您创建的最大同时连接数多一点),但您需要做一些性能进行测试以找到最佳值(value)。

如果发现最佳值很大,例如 500 或其他值,您可能会遇到线程处理的极限。在这种情况下,您应该考虑使用 greenlets。最简单的方法是使用 gevent——最简单的方法是重写代码以使用 grequests而不是 urllib2

与此同时,如果实际读取是在浪费时间,而您实际上并不需要响应,而且它们相当大,并且您不想测试服务器发送真实响应的能力,您可能需要一旦您知道您将获得正确的数据,请立即关闭套接字。您可以通过编写自己的处理程序来使用 urllib2 来完成此操作,但这听起来工作量很大。我认为在这种情况下,只下降到套接字级别实际上会更简单。首先,记录为每个 POST 发送的请求,以及当一切正常时您返回的预期 200 行。然后做这样的事情:

with closing(socket.socket()) as c:
    c.connect(('127.0.0.1', 8000))
    c.send(REQUEST_STRING_FORMAT.format([word]))
    with c.makefile() as f:
        response = f.readline()
        if response != RESPONSE_200_STRING:
            response += f.read()
            with open('error.html','w') as k:
                k.write(response)

关于python - 使用 Python 发送数千个 post 请求的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752906/

相关文章:

javascript - 在 React 中获取 POST API 的响应

java - fibonacci 在 python 中工作,但在 Java 中失败

python - Pandas 的 DataFrame 合并意外值

python - MySQL 连接器不工作 | Django 1.10 | window | Python 3.5

python - 如何确定 CherryPy 是否正在缓存响应?

php - jquery $.ajax 到 php 问题

基于 Java Web 的防火墙身份验证

python - Django 的 collectstatic 有什么意义?

php - URL 编码似乎妨碍了我的 PHP 程序中正确的 json 编码/解码

c - 关于编写代理以更改发送到站点的传出 http 消息的客户端 IP 的问题