全般

[Python] requestsライブラリでタイムアウトを設定する方法

今回は、Pythonのrequestsライブラリでタイムアウトを設定する方法についてご紹介します。

PythonでHTTP通信を行う際に便利なrequestsライブラリは、シンプルな構文でさまざまなリクエストを送信できます。

しかし、通信環境や対象サーバの応答速度によっては処理が長引く場合があるため、timeoutを適切に設定しておくことが重要です。

ここでは、timeout引数の基本から実用的なコード例、エラー処理や注意点などを解説します。

requestsライブラリとは

requestsライブラリは、Pythonの標準ライブラリであるurllibよりも簡潔な構文でHTTPリクエストを扱えるライブラリです。

GET、POSTなどの各種HTTPメソッドを直感的に使用でき、エラーハンドリングも充実しています。

pipなどのパッケージ管理ツールでインストールし、import requestsして利用します。

タイムアウト設定の基本

timeoutとは、指定した時間内に応答が得られない場合に例外を発生させる仕組みです。

timeout引数を活用すると、ネットワーク障害時のハングやレスポンス遅延によるリソースの無駄を抑制できます。

単一のタイムアウト値

以下のように、requests.get()requests.post()などのメソッドにtimeoutを指定するだけで簡単にタイムアウトを設定できます。

単一の数値を指定すると、接続タイムアウト(connect timeout)と読み込みタイムアウト(read timeout)両方に同じ秒数が適用されます。

タプルでのタイムアウト指定

より柔軟に設定する場合は、timeout=(接続タイムアウト, 読み込みタイムアウト)の形式を利用します。

次の例では、接続に3秒、レスポンス読み込みに7秒のタイムアウトを設けます。

このように別々の時間を指定できるため、ネットワーク特性やサーバの状況に合わせた調整が可能です。

具体的な使用例

ここでは、GETとPOSTリクエストの例に加え、エラーハンドリングも含めてコードを示します。

POSTリクエストでのタイムアウト設定

APIにデータを送信するケースを考えてみます。

POSTリクエストでも同様にtimeoutが利用できるため、大きなデータを送信する場合でも適度な制限を設けられます。

タイムアウトが発生した場合には例外が投げられるので、適切にエラーハンドリングを行うことが大切です。

例外処理の例

タイムアウト以外にもさまざまな通信エラーが起こり得ます。

requestsは、requests.exceptions.Timeoutrequests.exceptions.HTTPErrorrequests.exceptions.RequestExceptionなど、用途別の例外クラスを提供しているため、必要に応じてハンドリングしてください。

なお、response.raise_for_status()を呼び出すことで、HTTPエラー(4xx,5xx)時に例外を発生させることができます。

よくあるエラーと注意点

timeoutを活用する際には、いくつか気を付けるポイントがあります。

  • 設定時間を短くしすぎない
    短すぎるとネットワークの一時的な遅延などで頻繁にタイムアウトが発生し、正しい通信ができなくなる可能性があります。
  • 設定時間を長くしすぎない
    逆に長くしすぎると、ハング状態に陥ったリクエストを延々と待ち続ける可能性が高くなります。
  • 複数のエラーを想定する
    タイムアウトだけでなく、DNS解決エラーやHTTPエラーなどさまざまな例外が起こり得るため、包括的な例外処理を行うことが必要です。
  • リトライ機構の導入
    重要な通信処理であれば、リトライを実装するためにHTTPAdapterやRetryなどを併用する方法も検討してください。

こうしたポイントを踏まえてtimeoutを設定することで、通信の安定性と効率化を図れます。

まとめ

requestsライブラリでのtimeout設定は、通信時の無駄な待機を防ぐための重要な仕組みです。

単一の値やタプルを用いて接続・読み込みタイムアウトを調整し、各種例外を適切にハンドリングすることで、安定した通信処理が行えます。

ぜひ活用して、安全かつ効率的なHTTPリクエストを実装してください。