これはちょっと複雑な質問なので、できるだけ分かりやすく説明し、不必要な詳細をあまり与えないようにします。
昨年、仕事用の python スクリプトを開発しました。基本的なシステム データを取得し、それを HTTP/S サーバーに送信します。HTTP/S サーバーは、ユーザーが選択した場合にコマンドを送り返すことができます。何が機能し、何が機能しないかを確認することは、昨年の大きな実験のようなものでした. 社内などでさまざまなニーズをテストしていますが、今では必要なものをかなりしっかりと理解しています。だから私はバージョン2で旅を始めています。
この新しいバージョンの目的は、システム/CPU の負荷と帯域幅を削減しながら機能を維持することです。この Python スクリプトを開発した後、残りの作業は HTTP/S サーバー上で行われます。私の質問は、特にクライアント側、Python スクリプトに関するものです。ほとんどの場合、Debian ベースのシステムで Python 2.7.x を使用しています。
v1 スクリプトは、システム データを取得し、データを送信するサーバーを含む構成ファイルを読み取り、スレッドを使用して各サーバーに送信します。(これらのスレッドでも)各サーバーは1つ以上のコマンドを返すことができ、それらは独自のスレッドを介して処理されます。スクリプトは、crontab を介して 1 分に 1 回実行されます。5 つ以上のサーバーにそれぞれ 10 個のコマンドを送信させることができ、スクリプトは引き続きすべてをスムーズかつ効果的に実行し、サーバーが発行したコマンドを完了するのに長い時間はかかりません。
v2 スクリプトでは、次の必要な変更を加えようとしています。
システムサービスとして実行されます。そのため、毎分 cron によってコードが実行される代わりに、スクリプトは数秒ごとにループします。
ループは、ループを介して毎回データを収集し、それを各 Web サーバーに送信する必要があります (構成ファイルで定義されているとおり)。
パフォーマンスと帯域幅の最適化のために、永続的な HTTP/S 接続が必要です。
各 HTTP/S サーバーのループを介して毎回データを収集したくありません。サービスを駆動するメイン ループを介して反復ごとに 1 回だけデータを収集し、確立された HTTP/S 永続接続を管理しているスレッドにそのデータを送信します。
ここに私の問題があります。データを一度だけ収集しながら、それぞれのスレッド内で永続的な接続を取得し、それらのスレッドにデータを取得するにはどうすればよいですか?
httplibは TCP 接続を再利用しますか? このような方法で永続的な接続を行うことができることがわかりました (ありがとう、Corey Goldberg ):
con = httplib.HTTPConnection("myweb.com")
while True:
con.request("GET", "/x.css", headers={"Connection":" keep-alive"})
result = con.getresponse()
result.read()
print result.reason, result.getheaders()
このループ内でデータ収集を行う必要があります。しかし、私はこれを複数のスレッドで同時にさまざまなサーバーと通信する必要があり、データを複数回フェッチするためにリソースを浪費したくありません。私の Python に関する知識は比較的限られているため、それがどのように可能かはわかりません。
基本的に、現在見ているように、スレッド内で HTTP/S を駆動するループが必要です。次に、データを収集して HTTP/S 接続に接続できるように準備するために、ある種のループが必要です。しかし、どうすれば最初のループを 2 番目のループの中に入れることができるでしょうか? データ収集ループ内に HTTP/S 永続接続ループが必要なようですが、HTTP/S ループ内にもデータ収集ループが必要です。
これを実現するための純粋な 2.7.x Pythonic の方法を調べたいと思います。外部ユーティリティに依存することは、さまざまな理由で問題になる可能性があります。このスクリプトは、完成すると 150 以上の Linux システムに展開されます。
ご協力いただきありがとうございます。