質問するログイン新規登録

Q&A

1回答

167閲覧

PythonでFX APIからデータ取得時にタイムアウトエラーが頻発する

kenichimiyake

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2025/12/12 04:25

編集2025/12/12 04:27

0

0

実現したいこと

FX情報サイトhttps://song.co.jp/fx/で、複数のFXブローカーが提供するREST APIから
USD/JPYの為替レートを取得して比較表を作成しています。

Pythonのrequestsライブラリを使って各APIにアクセスしていますが、
一部のブローカーAPIで頻繁にタイムアウトエラーが発生し、
データ取得が不安定になっています。

安定してデータを取得できるようにしたいです。

発生している問題・分からないこと

5つのブローカーAPIから順次データを取得していますが、
そのうち2つのAPIで約50%の確率でタイムアウトエラーが発生します。

特にアクセスが集中する時間帯(NY市場オープン時など)に頻度が高くなります。

エラーメッセージ

error

1requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='api.broker-example.com', port=443): Read timed out. (read timeout=5) 2

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

【試したこと1】
timeoutを5秒から10秒、30秒と延長してみました。
→ 結果: エラー頻度は減りましたが、完全には解決せず。
また、レスポンスが遅いAPIのせいで全体の処理時間が大幅に増加しました。

【試したこと2】
requests.Sessionを使ってコネクションプールを有効化しました。
→ 結果: わずかに改善しましたが、根本的な解決には至りませんでした。

【試したこと3】
Googleで「requests timeout retry」で検索し、
retry処理の実装例を探しましたが、どの方法がベストプラクティスか判断できませんでした。

【質問したいこと】
・タイムアウトを回避するための推奨実装方法
・リトライ処理を組み込む際のベストプラクティス
・複数APIを効率的に処理する方法(並行処理など)

現在のコード:

python

1import requests 2 3def get_forex_rate(url): 4 try: 5 response = requests.get(url, timeout=5) 6 return response.json()['rate'] 7 except requests.exceptions.ReadTimeout: 8 print("タイムアウト") 9 return None 10 11urls = [ 12 "https://api.broker-a.com/rates/USDJPY", 13 "https://api.broker-b.com/rates/USDJPY" 14] 15 16for url in urls: 17 rate = get_forex_rate(url) 18 print(f"Rate: {rate}") 19 20### 補足 21特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

meg_

2025/12/12 05:14

> 特にアクセスが集中する時間帯(NY市場オープン時など)に頻度が高くなります。 根本的な対策は時間をずらすこと以外ないように思います。リトライするほどアクセス集中に寄与しますよね・・・
guest

回答1

0

発生率50%というのが一日を通してなのか 「特にアクセスが集中する時間帯」での話なのか、により変わるかも、、、ですが「全体の処理時間が大幅に増加」をいくらかでも緩和する事はできるかも。
timeoutしたら直ちにリトライ ではなく、他のに浮気してそれらが終わったらリトライする。
頻繁に起きる2つを先頭にもってくると効果が高いですね。

あと、
どのくらいの頻度で回してるのかな。デイトレードしてるとすると秒を争うことになるだろうから (1)取得終了したら直ちに次の? (2)それとも毎分? (3)それとも毎時?
50%確率でかつ全体の処理時間を気にしているとすると(3)ではなさそうですね。(1)(2)でしたら取得できるまでリトライではなく 1,2回リトライして駄目なら欠測扱いで次回まわし。何回リトライが良いか は 「何回リトライで取得できているか」の統計を取り作戦を練る。

meg_さんの「リトライするほどアクセス集中に寄与しますよね」は、なるほど、で
ネットワーク特にIPの世界では リトライ前に行うべき作法がありますね。

投稿2025/12/18 23:26

winterboum

総合スコア23689

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問