简单了解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中遍历文件的3个方法
Sep 02 Python
跟老齐学Python之模块的加载
Oct 24 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
没编程基础可以学python吗
Jun 17 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 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 Pear 安装及使用
2009/03/19 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
用pickle存储Python的原生对象方法
2017/04/28 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
python输入多行字符串的方法总结
2019/07/02 Python
Python中函数的返回值示例浅析
2019/08/28 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
个人社会实践自我鉴定
2014/03/24 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
贪污检举信范文
2015/03/02 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python