1

SSHライブラリを使用するすべての開発者はおそらく自分自身にこの質問をするべきだったので、それはとてもばかげた質問のように聞こえます(?)。しかし、ブロッキングと非ブロッキングの違いは何ですか...

つまり、1つは回答を受信するまでブロックし、もう1つはクエリを送信してすぐに戻り、応答バッファを自分で確認します...その部分を取得しました。

しかし、なぜ一方を他方ではなく使用するのでしょうか。なんとか答えが見つからない…公演のことですか?そして、違いがあるのなら、なぜですか?

この質問への回答を事前に感謝します。

---編集:次の「ボーナス質問」を忘れてください。私はついにノンブロッキングモードをコーディングしましたが、同じ問題が発生しました。これはlibssh2にあるはずです。だから私はまだノンブロッキングモードの付加価値を得ることができません...---

ボーナスの質問:
この違いが私が経験していることを説明できるかどうかは本当にわかりませんか?
いくつかのコマンドを実行するために多くのホストに接続するPythonスクリプトがあります。
非ブロッキングモードでparamikoライブラリを使用していました。Paramikoは純粋なPythonであり、多くのホストへのssh接続を確立するのに非常に時間がかかります...
Cライブラリlibssh2のPythonバインディングであるpylibssh2に変更します。違いがわからなかったので、ブロッキングモードでコーディングを始めました。

結果:
-libss2はparamikoよりもはるかに高速です(1分30秒ではなく4秒で230台のホストに並列接続)
-コマンドを連続して実行する場合、libssh2も高速です。
-複数の並列スレッドからsshを介してコマンドを実行すると、ブロッキングモードのlibssh2を使用したコードは、非ブロッキングモードのparamikoよりも遅くなります。
-また、CPU消費量が以前のバージョンと比較して非常に低いことに気づきました。これの一部はCとPythonに関連していると思いますが、SSH APIを超えているよりも、スクリプト自体のアクションが少ないようです。ブロッキングモードでSSHを介してコマンドを送信するときに、スレッドは互いにブロックしていますか?

4

1 に答える 1

0

その理由は、他のネットワーク接続からの読み取りとSSHセッションなど、2つのことを同時に実行する場合、2つのオプションがあるためです。

  • ブロッキングAPIを使用し、2つのスレッドまたはプロセスを使用して、両方を実行できるようにします

  • 同じスレッドが両方を実行できるように、非ブロッキングAPIを使用します

この後者のアプローチは、非同期I/Oと呼ばれます。たとえば、それを広範囲に使用するツイストを参照してください。

于 2013-01-08T12:37:42.237 に答える