5

長時間実行されている 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 nexttweepy/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 outfriends_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
  • スレッドが最終的にハングする前に、多くのsearchandlookup_users呼び出しで約 15 分間エラーが発生しませんでした。search
4

2 に答える 2