Python协程 yield与协程greenlet简单用法示例


Posted in Python onNovember 22, 2019

本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下:

协程

协程,又称微线程,纤程。英文名Coroutine。

协程是啥

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定

协程和线程差异

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

简单实现协程

import time
def work1():
  while True:
    print("----work1---")
    yield
    time.sleep(0.5)
def work2():
  while True:
    print("----work2---")
    yield
    time.sleep(0.5)
def main():
  w1 = work1()
  w2 = work2()
  while True:
    next(w1)
    next(w2)
if __name__ == "__main__":
  main()

运行结果:

----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
...省略...

greenlet

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

安装方式

使用如下命令安装greenlet模块:

sudo pip3 install greenlet
#coding=utf-8
from greenlet import greenlet
import time
def test1():
  while True:
    print "---A--"
    gr2.switch()
    time.sleep(0.5)
def test2():
  while True:
    print "---B--"
    gr1.switch()
    time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
#切换到gr1中运行
gr1.switch()

运行效果

---A--
---B--
---A--
---B--
---A--
---B--
---A--
---B--
...省略...

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python+selenium开发环境搭建图文教程
Aug 11 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
python3安装speech语音模块的方法
Dec 24 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
Python3.5文件修改操作实例分析
May 01 Python
python3.6环境安装+pip环境配置教程图文详解
Jun 20 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
python 实现倒计时功能(gui界面)
Nov 11 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 #Python
在OpenCV里使用Camshift算法的实现
Nov 22 #Python
利用Python的sympy包求解一元三次方程示例
Nov 22 #Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 #Python
python快速排序的实现及运行时间比较
Nov 22 #Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 #Python
Python Celery多队列配置代码实例
Nov 22 #Python
You might like
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
php旋转图片90度的方法
2013/11/07 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php三元运算符知识汇总
2015/07/02 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JS的replace方法介绍
2012/10/20 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python线程的几种创建方式详解
2019/08/29 Python
Python原始套接字编程实例解析
2020/01/29 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Python中常见的数制转换有哪些
2020/05/27 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
党员自我评议个人对照检查材料
2014/09/16 职场文书