Python urllib2.urlopen がタイムアウトを設定しても、スクリプトを無限にフリーズする

ネットワーク接続の問題が原因の可能性があります。urllib2.urlopen 関数を使用している場合、それはリモートサーバへの接続を確立し、サーバの応答を待機します。タイムアウト時間以内に応答が受信されなければ、関数はタイムアウト例外を送出します。しかし、ネットワークの問題が原因でサーバが応答できない場合、接続はオープンされたままになることがあり、その結果スクリプトがフリーズします。

この問題の解決策として、以下の方法をお試しください:

  1. urllib2モジュールをインポートする前に、ソケットモジュールを使用してグローバルタイムアウト時間を設定します。たとえば、タイムアウト時間を10秒に設定します。
import socket
socket.setdefaulttimeout(10)
import urllib2

このスクリプト全体で10秒のタイムアウトが使用されます。

  1. try-except で例外をキャッチする:例えば、urllib2.urlopen 関数の呼び出し時に try-except 文を使用して、タイムアウト例外をキャッチする。
import urllib2
try:
response = urllib2.urlopen(url, timeout=10)
# 处理响应
except urllib2.URLError as e:
# 处理超时异常
print("超时异常:", e)

タイムアウト例外をキャッチして、適切に処理します。

  1. サードパーティライブラリの使用:リクエストのようなより強力かつ柔軟なサードパーティライブラリの使用を検討します。リクエストライブラリは、優れたエラー処理およびタイムアウト制御機能を備えています。例:
import requests
try:
response = requests.get(url, timeout=10)
# 处理响应
except requests.exceptions.Timeout:
# 处理超时异常
print("请求超时")
except requests.exceptions.RequestException as e:
# 处理其他异常
print("请求异常:", e)

そうすることで、タイムアウトと例外処理がより適切に行なえます。

urllib2.urlopen関数が無限にフリーズしてしまうスクリプトの問題に対しては、グローバルタイムアウトを設定したり、try-exceptで例外をキャッチしたり、サードパーティのライブラリを利用してタイムアウトや例外処理をより細かく制御することを検討できます。

bannerAds