私が取り組んでいるサイトが公開される前にストレステストを行うために、小さな Python スクリプトを作成しました。while(true) ループで以下のコードを実行する新しいスレッドを 5 分ごとに生成することによって動作します。
conn = httplib.HTTPSConnection("site", 000, "pem", "pem", timeout = 30)
conn.request("GET", "/reports.php?" + url, headers = headers)
response = conn.getresponse()
read = (response.read())
スレッドが 1 つしかない場合、コードのリクエスト/レスポンスは毎回成功します。新しいスレッドを作成すると、以下のエラーが頻繁に発生します。最終的に、約 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
httplib が使用する ssl コードがスレッドセーフではないのか、それとも失敗の原因が他にあるのか疑問に思っていました。