简单了解python协程的相关知识


Posted in Python onAugust 31, 2019

什么是协程

协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的

通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的

协程和线程的差异

在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能

协程底层原理(举例)

'''
1,协程的实现原理,底层通过 yield 实现
'''
def work1(): #工作任务
  for i in range(10):
    print('work1----{}'.format(i))
    yield i
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    yield i
def work3():
  for i in range(10):
    print('work3----{}'.format(i))
    yield i
g1 = work1()
g2 = work2()
g3 = work3()
while True: #循环调用生成器实现任务切换
  try:
    print(next(g1))
    print(next(g2))
    print(next(g3))
  except StopIteration :
    pass
    break

协程 greenlet

python -m pip install greenlet

示例

'''
1,展示greenelent ,不能自动切换需要手动切换
'''
import greenlet
def work1():
  for i in range(10):
     print('work1----{}'.format(i))
     g2.switch()  #切换到g2
def work2():
  for i in range(10):
     print('work2----{}'.format(i))
     g1.switch() #切换到g1
g1 = greenlet.greenlet(work1) #返回协程对象
g2 = greenlet.greenlet(work2)
g1.switch() #启动开关

执行顺序

简单了解python协程的相关知识

gevent

greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换

'''
协程gevent IO操作会切换
'''
import gevent
def work1(): # 工作任务
  for i in range(10):
    print('work1----{}'.format(i))
    gevent.sleep(0.5)
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    gevent.sleep(0.5)
g1 = gevent.spawn(work1) #指定工作函数
g2 = gevent.spawn(work2) #指定工作函数
g1.join()  #等待协程执行完成再往下走
g2.join()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python插入排序算法实例分析
Jul 03 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
浅谈python中set使用
Jun 30 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Python高斯消除矩阵
Jan 02 Python
django中forms组件的使用与注意
Jul 08 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
python+requests接口自动化框架的实现
Aug 31 Python
利用rest framework搭建Django API过程解析
Aug 31 #Python
Python进度条的制作代码实例
Aug 31 #Python
python类的实例化问题解决
Aug 31 #Python
python检测服务器端口代码实例
Aug 31 #Python
python实现多线程端口扫描
Aug 31 #Python
python实现复制大量文件功能
Aug 31 #Python
django 做 migrate 时 表已存在的处理方法
Aug 31 #Python
You might like
php开发工具之vs2005图解
2008/01/12 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
总结javascript中的六种迭代器
2016/08/16 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python实现的最近最少使用算法
2015/07/10 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
优秀员工个人的自我评价
2013/11/29 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
上课睡觉检讨书
2014/01/28 职场文书
党员批评与自我批评
2014/02/12 职场文书
组工干部对照检查材料
2014/08/25 职场文书
个人专业技术总结
2015/03/05 职场文书
关爱空巢老人感想
2015/08/11 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
mysq启动失败问题及场景分析
2021/07/15 MySQL
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android