私はここで自分の快適ゾーンのかなり外側で何かをしているので、うまくいけば私はただ愚かなことをしているだけです。
特殊なデータベースを実行するために使用しているAmazonEC2インスタンスがあります。これは、RESTAPIを提供するTomcat内のWebアプリケーションを介して制御されます。同じサーバーで、Requestsライブラリを使用してデータベースに対して数十万の単純なクエリを実行するPythonスクリプトを実行しています(クエリを統合することはできないと思いますが、次に試してみます。 )。
問題:スクリプトを少し実行した後、SSH端末で突然パイプの破損エラーが発生します。SSHで再度ログインしようとすると、「操作がタイムアウトしました」というエラーが発生し続けます。そのため、ログインしてPythonプロセスを終了することすらできず、代わりにEC2インスタンスを再起動する必要があります(これは、特にエフェメラルストレージを使用しているため、非常に苦痛です)
私の理論では、リクエストがREST呼び出しを行うたびに、PythonとTomcatの間のポートのペアがアクティブになりますが、完了したときにポートが閉じられることはありません。そのため、Pythonはますます多くのポートを取得しようとし続け、最終的にはSSHポートを取得してロックする(私を起動する)か、すべてのポートを使用するだけで、ネットワークシステムが何らかの形で機能しなくなります(私が言ったように、私の深さから外れています。)
私も使ってみhttplib2
ましたが、同様の問題が発生していました。
何か案は?私のポート理論が正しい場合、それが完了したときにポートを放棄するように要求を強制する方法はありますか?または、少なくともログインしてプロセスを終了できるように、SSHポートを立ち入り禁止にするようにUbuntuに指示する方法はありますか?
または、Pythonを使用して非常に単純なREST呼び出しをたくさん行うためのある種のベストプラクティスはありますか?
編集:
解決済み...実行:
s = requests.session()
s.config['keep_alive'] = False
要求を行う前に、要求が完了したときに接続を解放するように要求を強制します。