質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

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

Q&A

解決済

2回答

7035閲覧

httpのrequestのタイムアウトエラーをなくしたい

sodiumplus3

総合スコア71

Python

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

0グッド

0クリップ

投稿2018/06/02 10:56

質問

Bitcoinの自動取引botを作成し、bitFlyerのgetparentordersというapiを利用し親注文の状況を取得する関数を作ったのですが、繰り返すとたまにエラーが出ます。要求がタイムアウトになってしまっているようなのですがどうすればこれを解消できるか困っています。エラーが出てもプログラムが止まらないようにする方法、またはタイムアウトをしないようにはできないでしょうか。タイムアウト値を大きくすればタイムアウトすることは無くなりますか?

発生している問題・エラーメッセージ

requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='api.bitflyer.jp', port=443): Read timed out. (read timeout=30)

該当の関数

python

1def position(): 2 api_key = API_KEY 3 api_secret = API_SECRET 4 5 base_url = "https://api.bitflyer.jp" 6 path_url = "/v1/me/getparentorders?product_code=FX_BTC_JPY" 7 method = "GET" 8 9 timestamp = str(datetime.datetime.today()) 10 11 12 message = timestamp + method + path_url 13 #print(message) 14 signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest() 15 #print(message.encode('utf-8')) 16 headers = { 17 'ACCESS-KEY' : api_key, 18 'ACCESS-TIMESTAMP' : timestamp, 19 'ACCESS-SIGN' : signature, 20 'Content-Type' : 'application/json' 21 } 22 23 response = requests.get( base_url + path_url , headers = headers , timeout = 30) 24 #pprint(response.json()) 25 return response.json()

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

公式のドキュメントには、タイムアウト時にrequests.exceptions.ConnectTimeoutの例外を出すみたいなので、受け取ってあげれば良いと思います。

python

1import requests 2from time import sleep 3 4 5def connect_google(url): 6 stand_by_sec = 5 7 try: 8 print(f"\nurl: {url}\tへ接続開始...") 9 r = requests.get(url, timeout=0.001) 10 except requests.exceptions.ConnectTimeout: 11 # タイムアウトした時は2秒待機して再実行 12 print(f"\rタイムアウトしました...\n再接続待機中...{stand_by_sec}秒後に再実行します", end="", flush=True) 13 sleep(stand_by_sec) 14 connect_google(url=url) 15 else: 16 # 成功時の処理 17 return r 18 finally: 19 # 後始末 20 pass 21 22 23r = connect_google(url="https://www.google.com")

こんな感じのヘルパー関数を定義してみてはいかがでしょうか

投稿2018/06/03 12:09

kiwibird

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

タイムアウト値を大きくすれば、もしかしたら多少応答が遅いときくらいはカバーできるかもしれませんが、ただこれを300とかにしても300秒待たされる訳で、しかもそれでも駄目なときは駄目です。根本的な解決にはなっていないような・・・

ちゃんとした例外処理、エラー処理を組み込む必要があると思いますが、そうすると「タイムアウトしたときはどんな風に処理を継続するか」をまず考えないと組めません。

投稿2018/06/02 17:56

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問