结合paramiko控制多台服务器建议别用协程,用多线程

协程中用paramiko的ssh服务小心拥塞

paramiko exec_command 后面加 stdout.read() 会导致 gevent 协程拥塞。

解决拥塞不用read()即可。另外要注意,如果命令是让服务器执行某个脚本,这个脚本里面含了"^M"(一般是在windows下生产文本导致,就算换行是\n也会产生),会导致脚本只执行了第一行内容。

或者在 connect 后,加一层transport 和 channel,这样天然不能有返回值。

transport = ssh.get_transport()
channel = transport.open_session()

参考 https://blog.csdn.net/wenq_yang/article/details/88951190

不用read(),传输sh命令让服务器执行shell脚本,如果脚本中命令不加> xxx.log 会导致在60s后消失。可能是不加的话类似启了终端,60s到时机就被kill了。有时加nohup &也没用。

现用现测。

一句话,用协程组合paramiko使用sshclient就是个大坑,不read()可能导致多台服务器上想要执行的脚本里面命令执行不完整,用read()则导致外部协程阻塞,不能让多台服务器真正同时执行。

结合 paramiko 控制多台服务器建议别用协程,用多线程

改用多线程就没上述问题了!

不要惧怕python的多线程所谓的性能问题

协程,又称微线程,英文名Coroutine,是运行在单线程中的“并发”,协程相比多线程的一大优势就是省去了多线程之间的切换开销,获得了更高的运行效率。程序员通过高超的代码能力,在代码执行流程中人为的实现多任务并发,是单个线程内的任务调度技巧。

协程的切换不同于线程切换,是由程序自身控制的,没有切换的开销。但正因如此,协程对接 paramiko 控制会很无力。并且是多余没必要的,交给多线程去做好了。

可能有人考虑到python有 全局解释器锁(GIL),以为python多线程不好用,但其实很多需求足够用了,比如同时控制很多服务器。根本没有你想象的性能问题。

另外并行做i/o操作,也还是多线程好些。上述情景类似。

posted @ 2020-09-24 11:50  VeyronC  阅读(445)  评论(1编辑  收藏  举报