简单了解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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
python通过函数属性实现全局变量的方法
May 16 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
python中添加模块导入路径的方法
Feb 03 Python
Python中requests做接口测试的方法
May 30 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 第三节 变量介绍
2012/04/28 PHP
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
PHP实现事件机制的方法
2015/07/10 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
浅谈js中的this问题
2017/08/31 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
Python高斯消除矩阵
2019/01/02 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
高考寄语大全
2014/04/08 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
中秋节活动总结
2014/08/29 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
师范生见习报告
2014/10/31 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
python中redis包操作数据库的教程
2022/04/19 Python