1

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

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

但是为什么要使用一个而不是另一个呢?我找不到答案……是关于表演的吗?如果有区别,为什么?

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

--- 编辑:忘记下面的“奖励问题”,我终于编写了非阻塞模式并遇到了同样的问题,它一定是 libssh2 中的东西。所以我还是没有得到非阻塞模式的附加价值……——

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

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

4

1 回答 1

0

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

  • 使用阻塞 API,并使用两个线程或进程,这样你就可以同时使用它们

  • 使用非阻塞 API,所以同一个线程可以同时做这两个

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

于 2013-01-08T12:37:42.237 回答