2012-02-17 71 views
0

我制作了一个小型python脚本来强调测试我在上市之前一直在处理的网站。它通过每隔5分钟产生一个新线程来运行,在一段时间(true)循环中运行下面的代码。httplib.HTTPSConnection在并发环境中导致SSL错误

conn = httplib.HTTPSConnection("site", 000, "pem", "pem", timeout = 30) 
conn.request("GET", "/reports.php?" + url, headers = headers) 
response = conn.getresponse() 
read = (response.read()) 

如果我只有一个线程,那么代码请求/响应每次都成功。在创建新线程时,我经常会遇到下面的错误。最终当有大约10个线程时,大约90%的时间都会失败。

Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "stresstest.py", line 32, in threadproc 
    stressTest(conn) 
    File "stresstest.py", line 76, in stressTest 
    response = conn.getresponse() 
    File "/usr/lib/python2.7/httplib.py", line 1027, in getresponse 
    response.begin() 
    File "/usr/lib/python2.7/httplib.py", line 407, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python2.7/httplib.py", line 365, in _read_status 
    line = self.fp.readline() 
    File "/usr/lib/python2.7/socket.py", line 430, in readline 
    data = recv(1) 
    File "/usr/lib/python2.7/ssl.py", line 232, in recv 
    return self.read(buflen) 
    File "/usr/lib/python2.7/ssl.py", line 151, in read 
    return self._sslobj.read(len) 
SSLError: The read operation timed out 

我想知道如果ssl代码httplib使用不是线程安全的,或者如果有其他原因的失败?

回答

2

它是线程安全的。您可能需要开始查看服务器代码的性能...

+2

显然,即使连接成功协商,超时也会在指定的时间量后终止连接。我认为只有在规定的时间内无法建立连接才会超时。删除超时后,所有请求都成功了,但仍然比我想要的慢。 – ClassicThunder 2012-02-17 21:23:10