简单了解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实现删除Android工程中的冗余字符串
Jan 19 Python
深入理解python中的闭包和装饰器
Jun 12 Python
python僵尸进程产生的原因
Jul 21 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Django中Model的使用方法教程
Mar 07 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
Python坐标线性插值应用实现
Nov 13 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 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
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
python实现划词翻译
2020/04/23 Python
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
使用python装饰器验证配置文件示例
2014/02/24 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
python的变量与赋值详细分析
2017/11/08 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python 循环数据赋值实例
2019/12/02 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
个人主要事迹材料
2014/08/26 职场文书
教代会闭幕词
2015/01/28 职场文书
公司会议开幕词
2015/01/29 职场文书
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技