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读写文件操作示例程序
Dec 02 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
Python编写一个优美的下载器
Apr 15 Python
django 开发忘记密码通过邮箱找回功能示例
Apr 17 Python
python flask框架实现重定向功能示例
Jul 02 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
python如何判断IP地址合法性
Apr 05 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
python如何建立全零数组
Jul 19 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 Python
Python OpenCV形态学运算示例详解
Apr 07 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
如何在PHP中生成随机数
2020/06/04 PHP
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
python轻松查到删除自己的微信好友
2016/01/10 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
python中join()方法介绍
2018/10/11 Python
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
建筑工程管理专业自荐信范文
2013/12/28 职场文书
总裁助理岗位职责
2014/02/17 职场文书
高中学生自我评价范文
2014/09/23 职场文书
参观邀请函范文
2015/02/02 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
Python中re模块的元字符使用小结
2022/04/07 Python
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript