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用来获得图片exif信息的库实例分析
Mar 16 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python温度转换实例分析
Jan 17 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
python绘制热力图heatmap
Mar 23 Python
Django 表单模型选择框如何使用分组
May 16 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
学python安装的软件总结
Oct 12 Python
python实现图像外边界跟踪操作
Jul 13 Python
基于python实现删除指定文件类型
Jul 21 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
Discuz! Passport 通行证整合
2008/03/27 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
Node.js简单入门前传
2017/08/21 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
python解析中国天气网的天气数据
2014/03/21 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python Grid使用和布局详解
2018/06/30 Python
python定时任务 sched模块用法实例
2019/11/04 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Python 多进程、多线程效率对比
2020/11/19 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
进修护士自我鉴定
2013/10/14 职场文书
《画家乡》教学反思
2014/04/22 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
三八节活动主持词
2015/07/04 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python