urllib2.urlopenタイムアウト問題解決策
3479 ワード
timeoutパラメータが設定されていないため、結果的にネットワーク環境が悪い場合、read()メソッドに何の反応もないという問題がしばしば発生し、プログラムカードはread()メソッドで死んで、長い間問題を見つけ、urlopenにtimeoutを加えるとokになり、timeoutを設定した後にタイムアウトした後にreadがタイムアウトしたときにsocketを投げ出す.timeout異常、プログラムを安定させるにはurlopenに異常処理を加え、異常再試行を加える必要があり、プログラムは完璧です.
ソリューション:
ネットワークデータを取得する際に、相手のネットワーク速度が遅い、サーバがタイムアウトするなどの理由でurllib 2を招くことがあります.urlopen()以降のread()操作(ダウンロードコンテンツ)カードが死んだ場合、この問題を解決する方法は以下の通りです.
1、urlopenのオプションパラメータtimeoutを設定する
2、グローバルのsocketタイムアウトを設定する:
3、タイマーtimerを使う
import urllib2
url='http://www.facebook.com/'
fails = 0
while True:
try:
if fails >= 20:
break
req = urllib2.Request(url)
response = urllib2.urlopen(req, None, 3)
page = response.read()
except:
fails += 1
print ' , : ', fails
else:
break
ソリューション:
ネットワークデータを取得する際に、相手のネットワーク速度が遅い、サーバがタイムアウトするなどの理由でurllib 2を招くことがあります.urlopen()以降のread()操作(ダウンロードコンテンツ)カードが死んだ場合、この問題を解決する方法は以下の通りです.
1、urlopenのオプションパラメータtimeoutを設定する
import urllib2
# http://classweb.loxa.com.tw/dino123/air/P1000772.jpg
r = urllib2.Request("http://classweb.loxa.com.tw/dino123/air/P1000775.jpg")
try:
print 111111111111111111
f = urllib2.urlopen(r, data=None, timeout=3)
print 2222222222222222
result = f.read()
print 333333333333333333
except Exception,e:
print "444444444444444444---------" + str(e)
print "55555555555555"
2、グローバルのsocketタイムアウトを設定する:
import socket
socket.setdefaulttimeout(10.0)
:httplib2 or timeout_urllib2
http://code.google.com/p/httplib2/wiki/Examples
http://code.google.com/p/timeout-urllib2/source/browse/trunk/timeout_urllib2.py
3、タイマーtimerを使う
from urllib2 import urlopen
from threading import Timer
url = "http://www.python.org"
def handler(fh):
fh.close()
fh = urlopen(url)
t = Timer(20.0, handler,[fh])
t.start()
data = fh.read() #
t.cancel()