我有一个使用 HTTP 连接下载数据的数据密集型Python脚本。我通常在一夜之间运行它。有时连接会失败,或者网站会暂时不可用。我有基本的错误处理,可以捕获这些异常并定期重试,在重试 5 分钟后优雅地退出(并记录错误)。
但是,我注意到有时工作会冻结。没有抛出错误,作业仍在运行,有时在最后一条打印消息后数小时。
最好的方法是:
- 监控Python 脚本,
- 检测它是否在给定时间间隔后无响应,
- 如果它没有响应就退出它,
- 并开始另一个?
更新
感谢大家的帮助。正如你们中的一些人所指出的,urllib和socket模块没有正确设置超时。我将Python 2.5与Freebase和urllib2模块一起使用,并捕获和处理MetawebErrors和urllib2.URLErrors。这是最后一个脚本挂起 12 小时后的错误输出示例:
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/session.py", line 369, in _httpreq_json
resp, body = self._httpreq(*args, **kws)
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/session.py", line 355, in _httpreq
return self._http_request(url, method, body, headers)
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/httpclients.py", line 33, in __call__
resp = self.opener.open(req)
File "/usr/lib/python2.5/urllib2.py", line 381, in open
response = self._open(req, data)
File "/usr/lib/python2.5/urllib2.py", line 399, in _open
'_open', req)
File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
result = func(*args)
File "/usr/lib/python2.5/urllib2.py", line 1107, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.5/urllib2.py", line 1080, in do_open
r = h.getresponse()
File "/usr/lib/python2.5/httplib.py", line 928, in getresponse
response.begin()
File "/usr/lib/python2.5/httplib.py", line 385, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.5/httplib.py", line 343, in _read_status
line = self.fp.readline()
File "/usr/lib/python2.5/socket.py", line 372, in readline
data = recv(1)
KeyboardInterrupt
您会注意到底部的套接字错误。由于我使用的是Python 2.5并且无法访问第三个urllib2.urlopen选项,是否有另一种方法可以监视和捕获此错误?例如,我正在捕获URLErrrrors - urllib2或套接字中是否有另一种类型的错误,我可以捕获对我有帮助的?