zoukankan      html  css  js  c++  java
  • 结合paramiko控制多台服务器建议别用协程,用多线程

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

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

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

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

  • 相关阅读:
    nhibernate记事
    关于mysql数据库中,连续签到等连续日期的处理
    记IIS部署https arr urlrewrite
    mybatis Generator
    CGI
    FreedonStudio freertos 内存分配方式选择
    NB模块BC26调试记录
    调试升级程序记录
    最近做的一个嵌入式项目
    4*4键盘扫描程序--去抖加长按
  • 原文地址:https://www.cnblogs.com/xrszff/p/13723413.html
Copyright © 2011-2022 走看看