一、概述

  感觉确实用着比generator还简单了呢,但好像还没有解决一个问题,就是遇到IO操作,自动切换,对不对?所以我们接下来就说说如何遇到IO就切换,不得不提到一个模块Gevent。

  Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

二、Gevent

2.1、代码

说明:gevent是第三方库,需要pip install一下

import  geventdef foo():print("Running in foo")gevent.sleep(2)  #模仿io操作,一遇到io操作就切换print("Explicit context switch to foo again")def bar():print("Explicit context to bar")gevent.sleep(1)print("Implicit context switch back to bar")def fun3():print("running fun3")gevent.sleep(0)   #虽然是0秒,但是会触发一次切换print("running fun3 again")gevent.joinall([gevent.spawn(foo),#生成协程gevent.spawn(bar),gevent.spawn(fun3)
])

注意:遇到IO就切换了,整体程序还需要花2秒钟执行的,最长的就是2秒,如果是串行的话就是3秒。

2.2、逻辑图

图解:

  当foo遇到sleep(2)的时候,切自动切换到bar函数,执行遇到sleep(1)的时候自动切换到fun3函数,遇到sleep(0)又自动切换到foo。这个时候sleep(2)还没有执行完毕,又切换到bar的sleep(1)这边,发现又没有执行完毕,就有执行fun3这边,发现sleep(0)执行完毕,则继续执行,然后又切换到foo,发现sleep(2)又没有执行完毕,就切换到bar的sleep(1)这边,发现执行完了,有切回到foo这边,执行完毕。

三、用途

  比如说你现在又50处IO,然后总共加起来串行的的话,要花100秒,但是50处IO最长的那个IO只花了5秒钟,那代表中你的这个程序就是协程最多5秒就执行完毕了。

转载于:https://www.cnblogs.com/zhangqigao/articles/7383927.html

day10-协程遇到IO操作自动切换相关推荐

  1. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  2. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  3. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

  4. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

    前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...

  5. python进程\协程\异步IO

    进程 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! Python ...

  6. python异步和进程_12.python进程\协程\异步IO

    进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , P ...

  7. 5,线程池,进程池,协程,IO模型

    今日内容: 1,线程池 2,进程池 3,协程 4,IO 模型 服务端要满足这三个条件: 1,24小时不间断的提供服务 2,能够支持高并发 3,要有固定的IP地址和端口在服务端这个地方会出现阻塞态情况: ...

  8. 进程池和线程池,协程,IO多路复用

    进程池.线程池: 开进程池和线程池都是要消耗资源的,只不过比较而言消耗的资源进程池多一点,线程池少一点 就是在计算机硬件能承受的最大范围内去利用计算机. 什么是池? 就是在保证计算机硬件安全的情况最大 ...

  9. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

最新文章

  1. 计算机里面有鬼的恐怖游戏,2018年度十大最佳PC恐怖游戏
  2. 海量数据库解决方案2011032301
  3. HTML文本错位,DIV+CSS网页错位诊断和解决方法
  4. Python学习之路,第二次复习:列表,元组
  5. 就业模拟试题(.NET部分)
  6. Spring Schedule配置及初始化
  7. TypeScript 的 Object Types
  8. mybatis-plus对datetime返回去掉.0_0欧姆电阻只能当导线用?12种用法来学习下
  9. 3.深度学习的实用层面
  10. 搭建rtmp推流服务器
  11. android qq消息推送消息,最新版手机QQ怎么发送定时消息
  12. c语言中pinMode的作用,Arduino编程基础与常用函数(详细)解析
  13. Android开发——数据库框架Suger遇到的大坑(Gson和Suger的复用Bean请见“大坑三”)
  14. 【HTML】人生苦短, 快卷快卷 第二课 HTML 基础
  15. 关于华硕电脑进入bios
  16. vue3监听网页窗口关闭
  17. ajax实现直播功能,jquery实现直播弹幕效果
  18. JS 测试网络速度与网络延迟
  19. 【深度学习】步态识别-论文阅读:(T-PAMI-2021)综述:Deep Gait Recognition
  20. 屁股决定脑袋--是否可以把0603电容更换为0402的电容

热门文章

  1. wordpress主题Z-blog拓源纯净版
  2. php break 用法,PHP break语句
  3. oracle和mysql的备份有几种方法_Oracle 数据库的备份与恢復都有哪几种方法?
  4. python遇到对象_### python面对对象小汇总 #####
  5. 频域串联滞后校正matlab,自动控制原理实验七基于MATLAB控制系统频域法串联校正设计.doc...
  6. linux java 进程内存_linux – 在java进程中消耗内存的是什么?
  7. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目
  8. Imagine开源图片压缩程序源码
  9. C# 实现软件自动更新升级程序
  10. 连连看外挂消去算法分析