Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能';Don’不要在eventlet greenthread中抓住坏消息_Python_Try Catch_Urllib2_Semaphore_Httplib - Fatal编程技术网

Python 我能';Don’不要在eventlet greenthread中抓住坏消息

Python 我能';Don’不要在eventlet greenthread中抓住坏消息,python,try-catch,urllib2,semaphore,httplib,Python,Try Catch,Urllib2,Semaphore,Httplib,我有一个长时间运行的进程,大约每三天就会崩溃一次,因为在HTTP连接期间,在连接完成后但在收到任何数据之前,httplib会抛出BadStatusLine。我已经尝试包装我的调用,但是异常只会导致堆栈跟踪并停止进程 #supporting code included for clarity from httplib import BadStatusLine, HTTPException import eventlet sem = eventlet.semaphore.Semaphore(SIMU

我有一个长时间运行的进程,大约每三天就会崩溃一次,因为在HTTP连接期间,在连接完成后但在收到任何数据之前,httplib会抛出BadStatusLine。我已经尝试包装我的调用,但是异常只会导致堆栈跟踪并停止进程

#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
我之所以使用信号量,是因为我不希望我的代码每秒访问站点超过一次(但我不希望出于代码中其他地方的原因而放弃eventlet)

最终,对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

是否是我奇怪地使用qthreads导致BadStatusLine从未到达catch语句?是否有什么地方可以插入超时以导致最终到达except块?

如果唯一的问题是释放信号量,为什么不使用
try/finally
语法

try:
    sem.acquire()
    eventlet.sleep(HIT_DELAY)
    lphtml = urllib2.urlopen(list_page_url).read()
finally:
    sem.release()
尝试使用

从eventlet.green.httplib导入HTTPException

而不是

从httplib导入BadStatusLine,HTTPException

注意:httplib.BadStatusLine是httplib.HTTPException()的子类,因此BadStatusLine也将被捕获