简单了解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内置函数delattr的具体用法
Nov 23 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
python实现换位加密算法的示例
Oct 14 Python
Face++ API实现手势识别系统设计
Nov 21 Python
Python内置类型性能分析过程实例
Jan 29 Python
Python configparser模块操作代码实例
Jun 08 Python
通过实例了解python__slots__使用方法
Sep 14 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php全排列递归算法代码
2012/10/09 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
python关键字and和or用法实例
2015/05/28 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python反射的用法实例分析
2018/02/11 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
国际残疾人日广播稿范文
2014/10/09 职场文书
道歉情书大全
2015/05/12 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
学校食堂管理制度
2015/08/04 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android