我有一個數據密集的Python腳本,它使用HTTP連接下載數據。我通常在一夜之間運行它。有時連接將失敗,或者網站暫時不可用。我有基本的錯誤處理,捕獲這些異常並定期再次嘗試,5分鐘後重試正常退出(並記錄錯誤)。如何監視「卡住」的Python腳本?
不過,我已經注意到,有時工作只是凍結。沒有錯誤發生,並且作業仍在運行,有時在最後一次打印消息之後數小時。
什麼是最好的辦法:
- 顯示器 Python腳本,
- 檢測,如果它是一個給定的時間間隔後反應遲鈍,
- 退出它,如果它是反應遲鈍,
- 和開始另一個呢?
UPDATE
感謝大家的幫助。作爲少數的你已經指出的那樣,的urllib和插座模塊沒有正確設置超時。我使用Python 2.5的與遊離鹼和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選項,有另一種方式來監視,趕上這個錯誤?例如,我正在捕捉URLErrrors - urllib2或套接字是否有另一種類型的錯誤,我可以捕獲哪些可以幫助我?
您的http請求是否超時?像urllib這樣的模塊的基本功能沒有它們。 – 2010-11-04 02:14:06
請參閱我的更新,瞭解如何在套接字模塊中設置默認超時。請注意,缺省超時並不是套接字模塊中的缺陷,因爲強加任意超時會中斷需要很長時間的有效套接字操作,如大文件傳輸。 – twneale 2010-11-05 16:25:27
我已經添加了您建議的邏輯,並且今晚將嘗試另一次運行。如果這不起作用,我會嘗試修改腳本以使用Python2.6來獲取默認超時。 – 2010-11-06 17:11:59