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 随机生成中文验证码的实例代码
Mar 20 Python
Python中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 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中创建并处理图象
2006/10/09 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
php读取3389的脚本
2014/05/06 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
php时间函数用法分析
2016/05/28 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
python如何实现word批量转HTML
2020/09/30 Python
网络工程师职业规划
2014/02/10 职场文书
土建工程师岗位职责
2014/06/10 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
课外小组活动总结
2014/08/27 职场文书
2015年工商所工作总结
2015/05/21 职场文书
机器人总动员观后感
2015/06/09 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js