简单了解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爬虫代理IP池实现方法
Jan 05 Python
python与caffe改变通道顺序的方法
Aug 04 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
Python生成器的使用方法和示例代码
Mar 04 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python用input输入列表的实例代码
Feb 07 Python
树莓派升级python的具体步骤
Jul 05 Python
Python实现扫码工具的示例代码
Oct 09 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
简述php环境搭建与配置
2016/12/05 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
js函数调用的方式
2014/05/06 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
详解python 中in 的 用法
2019/12/12 Python
Python 列表的清空方式
2020/01/13 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
励志演讲稿800字
2014/08/21 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python