Python中Paramiko协程方式详解

  什么是协程程序员

  协程咱们能够看作是一种用户空间的线程。数组

  操做系统对齐存在一无所知,须要用户本身去调度。服务器

  好比说进程,线程操做系统都是知道它们存在的。协程的话是用户空间的线程,操做系统是不知道的。网络

  为何要使用协程多线程

  与线程不一样,协程是本身主动让出cpu,并交付它指望的下一个协程运行,而不是在任什么时候候都有可能被系统调度打断。所以协程的使用更加清晰易懂,而且多数状况下不须要锁机制。与线程相比,协程的切换由程序控制,发生在用户空间而非内核控件,所以切换的代价很是的小。某种意义上,协程与线程的关系相似与线程与进程的关系,多个协程会在同一个线程的上下文之中运行。这样程序很少线程好理解。来看一个视图。并发

  好比说一个进程它有多个线程,可是一个线程内它又有多个协程,而后这些协程就是说,有用户,就是程序员来讲定义它在何时交出控制权,给其它协程来进行一些操做。ssh

  gevent简介编辑器

  Python一个很著名的一个协程库就是geventgevent是一个基于libev的并发库。它为各类并发和网络相关的任务提供了郑洁的API。在gevent中用到的主要模式是Greenlet,它是以C扩展模块形式接入Python的轻量级协程。Greenlet所有运行在主程序操做系统进程的内部,但它们被协做式地调度。函数

  Python gevent APIspa

  gevent.spawn(func,args)建立greenlet

  gevent.sleep(seconds)greenlet上下文切换

  gevent.joinall(greenlets)阻塞当前流程,执行全部给定greenlet

  咱们来看一下视图。

  好比说这段代码它得执行是这样的,不如说它gevent建立出来的协程它sleep就是切换出来,就会到其它程序中去运行。而后其它程序再会让它在切换回来,它再回到原来的流程去运行这样,就作了一个交互式的操做。这样这张图就很明白的表名了这些。

  利用gevent实现

  对原有操做进行修改,手动切换。

  就是把这个程序切换出去,然给其它协程去操做。

  打开编辑器

  怎么改呢,这个是原来的查询远程机器的配置,这个好比说查询它的当前的时间。Data的话咱们,这个都是在以前的课程讲过。Process好比说ssh它这个配置把它的section传过去。

   好比说ssh0

  而后咱们如何修改呢,其实就是在原有的基础上让它手动的去切换,怎么切换咱们就gevent_process,例如说建立出这个对象我就把它切换出去,切换出去的时候,首先要引入这个gevent这个库,调用它的sleep让它手动的切换出去。不如说connect的时候在切换出去。

  建立gevent协程

  而后咱们就开始在主函数里面。 就创建协程,创建协程其实很简单好比它一个event=gevent.spawn,把协程的函数和它的参数传递进来。好比说它就是一个ssh0

  不如说咱们让它joinalljoinall是一个数组,而后这咱们应该申请一个events,把新请的这个events放进来。咱们把这个events阻塞,让这个进程等待全部协程的结束。咱们看一下。

  多个协程的话就很是简单了,咱们之前也看到过,好比说这个task_num6咱们就把它遍历,而后这个section就是这个样子就是ssh+str(i)

  而后把section传递进去,咱们能够看到好比说咱们能够查询六次,对六个机器进行查询。

  而后咱们这样就完成了,咱们能够看一下它的耗时,把它耗时给打印出来,就是两个的时间差

  它花费了3.80秒,咱们下去的话大概能够根据以前的经验,把这个顺序执行跟这个协程式的执行,协程式的具体来讲就是就是这台机器服务器的状态。这个过程它所发生时间其实它仍是一个时间优点的,只不过是在这个地方它是时间优点体现的不明显,是由于咱们只有在应用进程,而后在主动的去切换这个协程。而后在这parmiko的内部咱们实际上是没办法用,利用这个协程的切换来,由于它内部是封装起来的。只容许调用它现有的这些函数,咱们中间是没办法打断它的。

  只有在这个具体的执行的时候,好比说两个run_cmd之间咱们能够加一个协程让它切出去,好比说我这有查询一个其它的。

  好比说以前的查询它的内存,我能够在这在切一次。

  这样的话就主动地切换,就是说利用协程之间的操做的话,若是多个协程之间 咱们这样切换的话它其实最终的效果是比顺序执行的时候要好,它是利用了协程的这个有点。

  等待gevent协程结束。

 

原文连接:http://www.maiziedu.com/wiki/frame/coroutines/

相关文章
相关标签/搜索