简单了解python协程的相关知识

 更新时间:2019年08月31日 15:10:55   作者:北京_星空  
这篇文章主要介绍了简单了解python协程的相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

什么是协程

协程是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() #启动开关

执行顺序

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学生管理系统代码实现

    这篇文章主要为大家详细介绍了python学生管理系统代码实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 基python实现多线程网页爬虫

    基python实现多线程网页爬虫

    python是支持多线程的, 主要是通过thread和threading这两个模块来实现的,本文主要给大家分享python实现多线程网页爬虫,需要的朋友可以参考下
    2015-09-09
  • 详解Python中的动态属性和特性

    详解Python中的动态属性和特性

    本篇文章主要介绍了详解Python中的动态属性和特性,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • python tkinter实现连连看游戏

    python tkinter实现连连看游戏

    这篇文章主要介绍了python tkinter实现连连看游戏的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • Python实现多个圆和圆中圆的检测

    Python实现多个圆和圆中圆的检测

    这篇文章主要为大家详细介绍了Python如何实现多个圆检测和圆中圆的检测,文中的实现方法讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • Python迅速掌握语音识别之知识储备篇

    Python迅速掌握语音识别之知识储备篇

    语音识别是一门交叉学科。近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。人们预计,未来10年内,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域
    2021-11-11
  • Python编程使用Selenium模拟淘宝登录实现过程

    Python编程使用Selenium模拟淘宝登录实现过程

    这篇文章主要介绍了Python编程使用Selenium模拟淘宝登录的实现过程示例及解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • Python全局变量关键字global的简单使用

    Python全局变量关键字global的简单使用

    python中global关键字主要作用是声明变量的作用域,下面这篇文章主要给大家介绍了关于Python全局变量关键字global的简单使用,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python利用Tesseract识别验证码的方法示例

    python利用Tesseract识别验证码的方法示例

    无论是是自动化登录还是爬虫,总绕不开验证码,这次就来谈谈python中光学识别验证码模块Tesseract,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • python 实现在无序数组中找到中位数方法

    python 实现在无序数组中找到中位数方法

    这篇文章主要介绍了python 实现在无序数组中找到中位数方法,具有很好对参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论