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写的ARP攻击代码实例
Jun 04 Python
Python中Class类用法实例分析
Nov 12 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
详解Python发送email的三种方式
Oct 18 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
python实现名片管理系统项目
Apr 26 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
初识php MVC
2014/09/10 PHP
php实现的简单日志写入函数
2015/03/31 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
Javascript之面向对象--方法
2016/12/02 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
JS实现瀑布流效果
2020/03/07 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
管理信息系学生的自我评价
2014/01/11 职场文书
合作意向书格式及范文
2014/03/31 职场文书
小学班主任寄语大全
2014/04/04 职场文书
《白鹅》教学反思
2014/04/13 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Flask response响应的具体使用
2021/07/15 Python