结合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操作,也还是多线程好些。上述情景类似。