長時間実行されている Twitter スクレイピング スクリプトがあり、スタック トレースが末尾に付いてハングすることがある
"/usr/lib/python2.7/ssl.py", line 305: self._sslobj.do_handshake()
私の質問は「なぜですか?」そして「それを修正するにはどうすればよいですか?」.
通常、これが発生するまでに 1 週間ほどかかります。前回は、4 つのスレッドのうち 3 つがtweepy
ハングを処理していました (4 つ目はハングしたスレッドからの情報を待っていました)。不思議なことに、スレッドがハングする間にかなり長い遅延がありました。最初にスレッド呼び出しがapi.followers_ids()
ハングし、約 12 分後にスレッド呼び出しがapi.friends_ids()
ハングし、さらに 1 時間 12 分後 (!) スレッド呼び出しがapi.search()
ハングしました。これらすべての間に多くの API 呼び出しがありました。
シグナルを送信したときにスタック トレースをダンプする小さなコードがありQUIT
、ハングしたスレッドについては次のようなものが得られました。それらはすべて、2 番目のエントリ (tweepy/binder.py, line 185, in _call
部分) から (および含めて) 同じです。他の 2 つは と から取得しましtweepy/cursor.py, line 85 in next
たtweepy/cursor.py, line 60, in next
。
File "myTwitterScrapingScript.py", line 245, in checkStatus
status = api.rate_limit_status()
File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 185, in _call
return method.execute()
File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 146, in execute
conn.request(self.method, url, headers=self.headers, body=self.post_data)
File "/usr/lib/python2.7/httplib.py", line 958, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
self.endheaders(body)
File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
self.send(msg) File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 185, in _call
return method.execute()
File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 146, in execute
conn.request(self.method, url, headers=self.headers, body=self.post_data)
File "/usr/lib/python2.7/httplib.py", line 958, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
self.endheaders(body)
File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
self.send(msg)
File "/usr/lib/python2.7/httplib.py", line 776, in send
self.connect()
File "/usr/lib/python2.7/httplib.py", line 1161, in connect
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
File "/usr/lib/python2.7/ssl.py", line 381, in wrap_socket
ciphers=ciphers)
File "/usr/lib/python2.7/ssl.py", line 143, in __init__
self.do_handshake()
File "/usr/lib/python2.7/ssl.py", line 305, in do_handshake
self._sslobj.do_handshake()
スレッドがハングした頃に、いくつかの小さなエラーが発生しました。数は通常よりわずかに多いですが、それはそれほど珍しいことではありません。4 つ目は面白そうですが、スレッドがハングする直前に発生しました。
[Errno 110] : Connection timed out
最後の呼び出しの約 7 分前followers_ids()
(その間にさまざまな API 呼び出しが行われる)[Errno 104] Connection reset by peer
約3分後(繰り返しますが、その間にいくつかの呼び出しが成功しました)[Errno 110] Connection timed out
friends_ids()
ラストコールの約1.5分前。これはapi.search()
、最初のスレッドがハングする約 5 分前から待機していたスレッド内にあり、合計で約 15 分間待機していました。[Errno 104] Connection reset by peer
スレッドからの最後のニュースの約 2 ミリ秒前friends_ids()
で、同じスレッドにいました。収集したばかりの友達 ID のページはすべて正常に表示され、これらの呼び出しによるエラーはありませんでした。[Errno 104] Connection reset by peer
スレッドでは、スレッドがハングしsearch
てから約 17 分後、friends_ids
スレッドがハングする 1 時間近く前にsearch
.- 約 1.5 分後に理由の
Failed to send request
ない TweepError。 - 次の 45 分間に、さらに 3 回の理由のない
Failed to send request
と a 。[Errno 104] Connection reset by peer
- スレッドが最終的にハングする前に、多くの
search
andlookup_users
呼び出しで約 15 分間エラーが発生しませんでした。search