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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python set集合类型操作总结
Nov 07 Python
Python常用小技巧总结
Jun 01 Python
python爬取51job中hr的邮箱
May 14 Python
Python实现的生成格雷码功能示例
Jan 24 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python 显示数组全部元素的方法
Apr 19 Python
详解python多线程之间的同步(一)
Apr 03 Python
python dataframe NaN处理方式
Dec 26 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
php强制运行广告的方法
2014/12/01 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python3实现磁盘空间监控
2018/06/21 Python
python命令行工具Click快速掌握
2019/07/04 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
期终自我鉴定
2014/02/17 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
SQL 聚合、分组和排序
2021/11/11 MySQL
浅谈如何保证Mysql主从一致
2022/03/13 MySQL