简单了解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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
python使用nntp读取新闻组内容的方法
May 08 Python
Python网络爬虫实例讲解
Apr 28 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
简述Python2与Python3的不同点
Jan 21 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
python db类用法说明
Jul 07 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 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分页的功能模块
2015/06/16 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
详细讲解JS节点知识
2010/01/31 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python编程之序列操作实例详解
2017/07/22 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
献爱心倡议书
2014/04/14 职场文书
财务管理专业求职信
2014/06/11 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
工地材料员岗位职责
2015/04/11 职场文书
会计主管竞聘书
2015/09/15 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python