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中zip()函数用法实例教程
Jul 31 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
Python中print函数简单使用总结
Aug 05 Python
python Opencv计算图像相似度过程解析
Dec 03 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 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基础学习之变量的使用
2011/06/09 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
js实现随机点名小功能
2017/08/17 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
python3爬取各类天气信息
2018/02/24 Python
python基础教程项目三之万能的XML
2018/04/02 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Sanic框架路由用法实例分析
2018/07/16 Python
实例讲解python中的协程
2018/10/08 Python
基于python实现名片管理系统
2018/11/30 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
超市中秋节活动方案
2014/02/12 职场文书
奠基仪式主持词
2014/03/20 职场文书
社区居务公开实施方案
2014/03/27 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
工程安全生产协议书
2014/11/21 职场文书
扬州个园导游词
2015/02/06 职场文书
生日赠语
2015/06/23 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书