0

HTTP接続中、接続が確立された後、データが受信される前に、httplibがBadStatusLineをスローするため、約3日ごとにクラッシュする長時間実行プロセスがあります。呼び出しをラップしようとしましたが、スタック トレースで例外が発生し、とにかくプロセスが停止します。

#supporting code included for clarity
from httplib import BadStatusLine, HTTPException
import eventlet
sem = eventlet.semaphore.Semaphore(SIMULTENEOUS)

#problem code, running in one of many qthreads downloading various pages.
try:
    sem.acquire()
    eventlet.sleep(HIT_DELAY)
    lphtml = urllib2.urlopen(list_page_url).read()
    sem.release()
except (urllib2.URLError, urllib2.HTTPError, HTTPException, BadStatusLine) as e:
    sem.release()
    pipe.log.error("Could not download product list page %s\n%s" % (str(e), list_page_url))
    continue

コードが 1 秒に 1 回以上サイトにヒットするのを望まないため、セマフォを使用しています (ただし、コードの他の場所にある理由でイベントレットを削除したくありません。

最終的に urllib2.urlopen への呼び出しは BadStatusLine をスローしますが、キャッチされず、セマフォが解放されることはありません。これは生成されたスタック トレースです。

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/eventlet-0.9.16-py2.6.egg/eventlet/greenpool.py", line 80, in _spawn_n_impl
    func(*args, **kwargs)
  File "/home/myself/secret_filename.py", line 52, in poll_feed_hourly
    lphtml = urllib2.urlopen(list_page_url).read()
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1170, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1143, in do_open
    r = h.getresponse()
  File "/usr/lib/python2.6/httplib.py", line 990, in getresponse
    response.begin()
  File "/usr/lib/python2.6/httplib.py", line 391, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.6/httplib.py", line 355, in _read_status
    raise BadStatusLine(line)
BadStatusLine

BadStatusLine が catch ステートメントに到達しないのは、私の奇妙な qthreads の使用でしょうか? 例外ブロックに最終的に到達するようにタイムアウトを挿入できる場所はありますか?

4

2 に答える 2

0

try/finally唯一の問題がセマフォの解放である場合、構文を使用しないのはなぜですか?

try:
    sem.acquire()
    eventlet.sleep(HIT_DELAY)
    lphtml = urllib2.urlopen(list_page_url).read()
finally:
    sem.release()
于 2013-01-23T19:46:08.280 に答える
0

使ってみて

from eventlet.green.httplib import HTTPException

それ以外の

from httplib import BadStatusLine, HTTPException

注: httplib.BadStatusLine は httplib.HTTPException のサブクラス ( http://docs.python.org/2/library/httplib.html#httplib.BadStatusLine ) であるため、BadStatusLine もキャッチされます。

于 2014-01-30T10:02:12.773 に答える