什么是协程

  协程我们可以看做是一种用户空间的线程。

  操作系统对齐存在一无所知,需要用户自己去调度。

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

  为什么要使用协程

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

  比如说一个进程它有多个线程,但是一个线程内它又有多个协程,然后这些协程就是说,有用户,就是程序员来说定义它在什么时候交出控制权,给其它协程来进行一些操作。

  gevent简介

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

  Python gevent API

  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

  不如说我们让它joinall,joinall是一个数组,然后这我们应该申请一个events,把新请的这个events放进来。我们把这个events阻塞,让这个进程等待所有协程的结束。我们看一下。

  多个协程的话就非常简单了,我们以前也看到过,比如说这个task_num是6我们就把它遍历,然后这个section就是这个样子就是ssh+str(i)

  然后把section传递进去,我们可以看到比如说我们可以查询六次,对六个机器进行查询。

  然后我们这样就完成了,我们可以看一下它的耗时,把它耗时给打印出来,就是两个的时间差

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

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

  比如说之前的查询它的内存,我可以在这在切一次。

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

  等待gevent协程结束。

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

Python中Paramiko协程方式详解的更多相关文章

  1. python中的协程及实现

    1.协程的概念: 协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈. 因此,协程能保留 ...

  2. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  3. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  4. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  5. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  6. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  7. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  8. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  9. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

随机推荐

  1. shell: bad interpreter: No such file or directory

    执行shell脚本    错误提示如下:    bash: ./back : bad interpreter:No such file or directory 因为操作系统是windows,在win ...

  2. iOS传值之block传值(一)

    ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入 ...

  3. python for mysql

    # -*- coding: utf-8 -*- '''python coded by written in 2016/8/31 Used for get win os log for each win ...

  4. Nop源码分析二

    上文我们已经通过该行代码:var typeFinder = containerManager.Resolve<ITypeFinder>(); 从注入容器中获取到了typeFinder实例. ...

  5. IE6不支持min-heightt和min-width的解决办法

    IE6不支持min-height的解决办法 最小高度min-height是很有用的,但IE6却不支持.真烦人.有没有办法呢? 我们可以利用IE6不识别!important来实现: height:aut ...

  6. bitnami redmine每日自动备份

    主要思路:在半夜时停止服务,进行完整备份,然后再开启服务. 1.主脚本backup.bat: call backup-stopserver.batping /n 20 127.1 >nul ca ...

  7. postgresql常用命令

    1.createdb 数据库名称 产生数据库2.dropdb 数据库名称 删除数据库 3.CREATE USER 用户名称 创建用户4.drop User 用户名称 删除用户 5.SELECT use ...

  8. socket网络编程

    一.客户端/服务器架构 C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(Web服务) 最常用的软件服务器就是Web服务器,一台机器里放了一些网页或Web应用程序,然后启动服务,这样 ...

  9. eclipse构建maven+scala+spark工程 转载

    转载地址:http://jingpin.jikexueyuan.com/article/47043.html 本文先叙述如何配置eclipse中maven+scala的开发环境,之后,叙述如何实现sp ...

  10. 学习Linux系列--安装软件环境

    本系列文章记录了个人学习过程的点点滴滴. 回到目录 10.安装Lamp套件. 最简单的方式,如下 sudo tasksel install lamp-server Apache 菜鸟教程 Ubuntu ...