ssh - 差异阻塞和非阻塞模式

时间:2013-01-07 16:23:50

标签: python ssh

这听起来是如此愚蠢的问题,因为每个使用任何SSH库的开发人员都应该问自己这个问题(?)。但我真的无法找到阻塞或非阻塞之间的区别......

我的意思是好的...一个阻止它收到答案,另一个发送查询并立即返回,然后你自己检查回复缓冲区......我得到了那个部分。

但为什么要使用一个而不是另一个呢?我无法找到答案...... 这是关于表演吗?如果存在差异,为什么?

提前感谢您对此问题的任何回答。

---编辑:忘掉以下“奖金问题”,我终于编写了非阻塞模式并遇到了同样的问题,它必须是libssh2中的东西。所以我仍然没有得到非阻塞模式的附加价值...... ---

  

奖金问题:
  我不确定这种差异可以解释我正在经历的事情吗?   我有一个python脚本连接到许多主机以运行几个命令   它是在非阻塞模式下使用paramiko库。 Paramiko是纯粹的python,对于与许多主机建立ssh连接真的很慢......   我正在为pylibssh2更改它,这是C库libssh2的python绑定。由于我没有得到区别,我开始以阻止模式编码。

  结果:
    - libss2比paramiko快得多(连接到230个主机并行4s而不是1m30s)     - 为了连续运行命令,libssh2也更快     - 当我从几个并行线程通过ssh运行命令时,阻塞模式下libssh2的代码在非阻塞模式下比paramiko慢。
    - 我还注意到与先前版本相比,CPU消耗非常低。我猜这部分内容与C vs python有关,但似乎超出了SSH API,我的脚本本身执行的操作较少。在阻塞模式下通过SSH发送命令时线程是否相互阻塞?

1 个答案:

答案 0 :(得分:0)

原因是如果你想一次做两件事,比如从其他网络连接和你的SSH会话中读取,你有两个选择:

  • 使用阻止API,并使用两个线程或进程,以便您可以同时执行它们

  • 使用非阻塞API,因此同一个线程可以同时执行这两个操作

后一种方法称为Asynchronous I/O。例如,参见twisted广泛使用它。