urllib2
タイムアウトを考慮に入れることができないようです。私は、このトピックに関連するすべての投稿を読んだと思いますが、何も悪いことはしていないようです。私は正しいですか?ご親切にありがとうございました。
シナリオ:
残りのスクリプトに進む前に、インターネット接続を確認する必要があります。次に、以下に示す関数 (Net_Access) を作成しました。
- LAN または Wifi インターフェースが接続された状態でこのコードを実行し、既存のホスト名を確認すると、エラーや問題がないため、タイムアウトがないため、すべて問題ありません。
- LAN コネクタを抜いたり、存在しないホスト名をチェックしたりすると、タイムアウト値が無視されるようです。私のコードの何が問題になっていますか?
いくつかの情報:
- Ubuntu 10.04.4 LTS (VirtualBox v4.2.6 VM で実行、ホスト OS は MAC OS X Lion)
cat /proc/sys/kernel/osrelease: 2.6.32-42-generic
- パイソン 2.6.5
私のコード:
#!/usr/bin/env python
import socket
import urllib2
myhost = 'http://www.google.com'
timeout = 3
socket.setdefaulttimeout(timeout)
req = urllib2.Request(myhost)
try:
handle = urllib2.urlopen(req, timeout = timeout)
except urllib2.URLError as e:
socket.setdefaulttimeout(None)
print ('[--- Net_Access() --- No network access')
else:
print ('[--- Net_Access() --- Internet Access OK')
1) 動作中、LAN コネクタが差し込まれている
$ $ time ./Net_Access
[--- Net_Access() --- Internet Access OK
real 0m0.223s
user 0m0.060s
sys 0m0.032s
2) タイムアウトが機能せず、LAN コネクタが取り外されている
$ time ./Net_Access
[--- Net_Access() --- No network access
real 1m20.235s
user 0m0.048s
sys 0m0.060s
元の投稿に追加: テスト結果 (FQDN の代わりに IP を使用)
@unutbu (コメントを参照) で提案されているように、myhost の FQDN を IP アドレスに置き換えると、問題が修正されます。タイムアウトが有効になります。
LAN コネクタが接続されました...
$ time ./Net_Access [--- Net_Access() --- Internet Access OK
real 0m0.289s
user 0m0.036s
sys 0m0.040s
LAN コネクタが取り外されました...
$ time ./Net_Access [--- Net_Access() --- ネットワーク アクセスなし
real 0m3.082s
user 0m0.052s
sys 0m0.024s
これは良いことですが、タイムアウトは IP でのみ使用でき、FQDN では使用できないことを意味します。変...
DNS 解決前に取得せずに urllib2 タイムアウトを使用して IP を関数に渡す方法を誰かが見つけましたか、それとも最初にソケットを使用して接続をテストし、ターゲットに到達できることが確実なときに urllib2 を起動しますか?
どうもありがとう。