2013-01-07 52 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