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求解水仙花数的方法
May 11 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
详解Python中的动态属性和特性
Apr 07 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
详解Python基础random模块随机数的生成
Mar 23 Python
django连接oracle时setting 配置方法
Aug 29 Python
pygame实现非图片按钮效果
Oct 29 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
用python批量解压带密码的压缩包
May 31 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP 定界符 使用技巧
2009/06/14 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
js get和post请求实现代码解析
2020/02/06 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python设置检查点简单实现代码
2014/07/01 Python
使用Python中的cookielib模拟登录网站
2015/04/09 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Django中使用group_by的方法
2015/05/26 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
python实现对输入的密文加密
2019/03/20 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
事业单位接收函
2014/01/10 职场文书
《包身工》教学反思
2016/02/23 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
python 安全地删除列表元素的方法
2022/03/16 Python