randyfirst
@randyfirst (吉野 諒)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【質問です】Binance APIを使用しBOTを作成中です。レートリミットを超えてしまうとエラーが通知されてしまうのですが、理由が分かりません。どなたか教えてください。

解決したいこと

プログラミング初心者です。
現在、仮想通貨の急騰急落を通知するBOTを作成しております。

以下のコードを作成しました。
具体的には、5分前に取得した価格よりも現在価格が値上がりしているならばツイッターに「〇〇の価格が〇〇%変わりました」とつぶやくというものです。2種類の仮想通貨を同時に処理させています。

source code 1.JPG
source code 2.JPG

そこで、このコードを実行すると以下のエラーメッセージが現れます。

error message.JPG

エラーになるほど多くのリクエストを送らないようにコードを書いているのですが、結果的に多くのリクエストを送っているようです。
コードの書き方の問題があるのであれば、ご教示お願い致します。

ちなみに、while True:での無限ループを除くとエラーは表示されません。更に、並列処理でなく、main()のみを無限ループさせてもエラーは出ません。このコードで一回あたりに何回のリクエストを送っているかを把握する方法がありますでしょうか?

今回のコード内で使用している関数はget_ticker(symbol)×4回のみで、レートリミットは一分間に1200なので問題ないと考えておりました。

0

1Answer

このコードで一回あたりに何回のリクエストを送っているかを把握する方法がありますでしょうか?

手っ取り早く把握するには main と main2 の最初で現在時刻を print してください。そのようにするとわかると思いますが、このコードでは main と main2 が毎秒無数に実行されます。

その理由は、 t1.start()t2.start() がスレッドの終了を待たないからです。2つのスレッドを起動するとすぐに while True: の次のループに入るため、スレッドが大量に作られてしまいます。

スレッドの終了を待つには

t1 = threading.Thread(target=main)
t2 = threading.Thread(target=main2)

t1.start()
t2.start()

t1.join()
t2.join()

のように .join() を呼んでください。

また、今の実装では「1回目のリクエスト、5分待機、2回目のリクエスト」を繰り返すため、2回目と次の1回目が間髪入れずに実行されることになってもったいないです。以下のようにスレッド内でループするといいでしょう。

def main():
    previous_price = 現在価格を取得()

    while True:
        time.sleep(300)
        current_price = 現在価格を取得()
        if 値上がりしている:
            通知()
        previous_price = current_price

# main2() は略

if __name__ == '__main__':
    t1 = threading.Thread(target=main)
    t2 = threading.Thread(target=main2)

    t1.start()
    t2.start()

    t1.join()
    t2.join()
1Like

Comments

  1. @randyfirst

    Questioner

    貴重なありがとうございます。
    現在時刻のPrint、.join()、スレッド内ループについて、確認し問題解決できました。
    ありがとうございます。

    マルチポストの件、確認不足でした。
    申し訳ございません。
    今回は他の方にも意見を頂いたので質問を削除することは難しいですが、今後は気を付けます。申し訳ございませんでした。
  2. @randyfirst

    Questioner

    対応遅くなり申し訳ございません。
    teratail側でマルチポストの件、更新させていただきました。
    また、質問のステータスも解決済みとさせていただきました。

    どのように解決したかについては、teratail側でここのリンクを参照するように致しました。

    この度はご迷惑をおかけしまして申し訳ございませんでした。
    今後ともよろしくお願いいたします。

Your answer might help someone💌