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

使用Python发送数千个post请求的最快方式是什么?,python,http,post,Python,Http,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'}) r

我想以最快的方式发出成千上万的发帖请求。如何使用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连接,这意味着您必须处理每个请求的套接字创建/关闭开销。然后,根据您正在测试的内容,很有可能使它成为一个更好的测试。)

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

如果愿意,您可以编写自己的线程,只需给每个线程1/10的
单词
,并让它循环调用
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服务客户端允许您创建的最大同时连接数略多),但您需要进行一些性能测试以找到最佳价值

如果结果表明最佳值是巨大的,比如500或更多,那么您可能已经达到了线程的极限。在这种情况下,您应该考虑使用GLILTER。最简单的方法是使用
gevent
——最简单的方法是重写代码以使用,而不是
urlib2

同时,如果实际读取是在浪费时间,并且您实际上不需要响应,而且响应相当大,并且您没有尝试测试服务器发送真实响应的能力,那么您可能希望在知道将获得正确的数据后尽快关闭套接字。您可以通过编写自己的处理程序来使用
urllib2
实现这一点,但这听起来需要做很多工作。我认为,在这种情况下,将其降到套接字级别实际上会更简单。首先,记录每个帖子发送的请求,以及工作正常时返回的预期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)

你给这个计时了吗?是不是太慢了?是的,它已经运行了大约一个小时,而且还没有完成5%。我主要想知道是否有可能同时发出多个请求。试试谷歌搜索“拒绝服务攻击”,你会有很多想法。@alexis:注意,他达到了127.0.0.1,所以…有更简单的方法来处理服务器,比如递归地分叉进程,或者痛击交换…@Alexis:有一些关于你自己的有用提示。虽然现在我想起来了,像往常一样,社会工程在这里比黑客更容易。你只需要说服自己关掉电源开关,对吗?
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)