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 相关文章推荐
简单的编程0基础下Python入门指引
Apr 01 Python
python黑魔法之参数传递
Feb 12 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
python自动裁剪图像代码分享
Nov 25 Python
Python实现抢购IPhone手机
Feb 07 Python
Django 实现下载文件功能的示例
Mar 06 Python
python3.7.0的安装步骤
Aug 27 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
python 深度学习中的4种激活函数
Sep 18 Python
java关于string最常出现的面试题整理
Jan 18 Python
Python Pygame实现俄罗斯方块
Feb 19 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
2021年最新CPU天梯图
2021/03/04 数码科技
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
js 异步处理进度条
2010/04/01 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jquery validate demo 基础
2015/10/29 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
js+html实现周岁年龄计算器
2019/06/25 Javascript
js new Date()实例测试
2019/10/31 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
Django Admin实现上传图片校验功能
2016/03/06 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
python__new__内置静态方法使用解析
2020/01/07 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
煤矿安全演讲稿
2014/05/09 职场文书
学校创先争优活动总结
2014/08/28 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
导游欢送词
2015/01/31 职场文书
父亲节活动总结
2015/02/12 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书