2013-01-07 58 views
1

這聽起來像是很愚蠢的問題,因爲每個使用任何SSH庫的開發者都應該問自己這個問題(?)。但我無法真正發現阻塞或非阻塞之間有什麼區別...ssh - 差異阻塞和非阻塞模式

我的意思是好的...一個塊直到它收到答案,另一個發送查詢並立即返回,然後您檢查由你自己的答覆緩衝區...我得到了那部分。

但是爲什麼要使用一個而不是另一個?我無法找到答案... 是關於表演嗎?如果有差異,爲什麼?

在此先感謝您對此問題的任何答案。

---編輯:忘掉下面的「獎勵問題」,我終於編碼了非阻塞模式,並遇到同樣的問題,它必須是libssh2中的東西。所以,我還是不明白的非阻塞模式的附加值...... ---

獎金的問題:
我真的不知道會這樣差解釋一下我遇到?
我有一個python腳本連接到許多主機來運行幾個命令。
它在非阻塞模式下使用paramiko庫。 Paramiko是純Python,並建立ssh連接到很多主機真的很慢...
我改變它爲python綁定爲C庫libssh2 pylibssh2。由於我沒有得到區別,我開始以阻塞模式編碼。

結果:
- libss2比的paramiko快得多(在4S代替1m30s連接至230臺主機在平行)
- 對於連續運行命令,libssh2也更快。
- 當我通過ssh從幾個並行線程運行命令時,阻塞模式下的libssh2代碼比非阻塞模式下的paramiko慢。
- 我也注意到,與以前的版本相比,CPU消耗非常低。我猜這部分與C vs python有關,但它似乎超越了SSH API,我的腳本本身執行的操作較少。在阻塞模式下通過SSH發送命令時線程是否互相阻塞?

回答

0

的原因是,如果你想同時做兩件事情,說一些其他網絡連接閱讀,和你的SSH會話,你有兩個選擇:

  • 使用阻塞API和使用兩個線程或進程,所以你可以做這兩個

  • 使用非阻塞API,以便在同一個線程都可以做

後一種方法稱爲Asynchronous I/O。例如見twisted,它廣泛使用它。

+0

謝謝你的回答。 – Romain

+0

謝謝你的回答。我非常困惑,因爲我看到在並行線程中使用非阻塞模式來管理串行命令,以及許多沒有理由的例子。 – Romain