简单了解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 smallseg分词用法实例分析
May 28 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
使用python为mysql实现restful接口
Jan 05 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
基于pytorch的保存和加载模型参数的方法
Aug 17 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Python基于traceback模块获取异常信息
Jul 23 Python
python中time包实例详解
Feb 02 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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中逗号与点号的区别
2013/08/05 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP中常用的魔术方法
2017/04/28 PHP
农历与西历对照
2006/09/06 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
JavaScript工具库之Lodash详解
2019/06/15 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
在校生自我鉴定
2014/01/23 职场文书
新课培训心得体会
2014/09/03 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
校长新学期致辞
2015/07/30 职场文书
班主任工作总结范文
2015/08/13 职场文书