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爬虫抓取手机APP的传输数据
Jan 22 Python
Python中 Lambda表达式全面解析
Nov 28 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
python里 super类的工作原理详解
Jun 19 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python抓取多种类型的页面方法实例
Nov 20 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
实例代码讲解Python 线程池
Aug 24 Python
Python实现仓库管理系统
May 30 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 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
用jquery来定位
2007/02/20 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
晨会主持词
2014/03/17 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
教师节促销方案
2014/03/22 职场文书
提拔干部考察材料
2014/05/26 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
工商局调档介绍信
2015/10/22 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers