简单了解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 相关文章推荐
Django migrations 默认目录修改的方法教程
Sep 28 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
Python读取指定日期邮件的实例
Feb 01 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
Python实现非正太分布的异常值检测方式
Dec 09 Python
pyinstaller还原python代码过程图解
Jan 08 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
Python常用类型转换实现代码实例
Jul 28 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
Python上下文管理器Content Manager
Jun 26 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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
关于幼儿的自我评价
2013/12/18 职场文书
工程服务质量承诺书
2015/04/29 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2015大一新生军训感言
2015/08/01 职场文书