Python协程 yield与协程greenlet简单用法示例

 更新时间:2019年11月22日 09:34:13   作者:小飞侠v科比  
这篇文章主要介绍了Python协程 yield与协程greenlet简单用法,简要讲述了协程的概念、原理,并结合实例形式分析了Python协程 yield与协程greenlet基本使用方法,需要的朋友可以参考下

本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下:

协程

协程,又称微线程,纤程。英文名Coroutine。

协程是啥

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定

协程和线程差异

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

简单实现协程

import time
def work1():
  while True:
    print("----work1---")
    yield
    time.sleep(0.5)
def work2():
  while True:
    print("----work2---")
    yield
    time.sleep(0.5)
def main():
  w1 = work1()
  w2 = work2()
  while True:
    next(w1)
    next(w2)
if __name__ == "__main__":
  main()

运行结果:

----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
...省略...

greenlet

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

安装方式

使用如下命令安装greenlet模块:

sudo pip3 install greenlet

#coding=utf-8
from greenlet import greenlet
import time
def test1():
  while True:
    print "---A--"
    gr2.switch()
    time.sleep(0.5)
def test2():
  while True:
    print "---B--"
    gr1.switch()
    time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
#切换到gr1中运行
gr1.switch()

运行效果

---A--
---B--
---A--
---B--
---A--
---B--
---A--
---B--
...省略...

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • PyQt QCombobox设置行高的方法

    PyQt QCombobox设置行高的方法

    今天小编就为大家分享一篇PyQt QCombobox设置行高的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • pytorch 如何查看数据类型和大小

    pytorch 如何查看数据类型和大小

    这篇文章主要介绍了pytorch 实现查看数据类型和大小的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 机器学习经典算法-logistic回归代码详解

    机器学习经典算法-logistic回归代码详解

    这篇文章主要介绍了机器学习经典算法-logistic回归代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python学习开发之图形用户界面详解

    Python学习开发之图形用户界面详解

    当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),python也提供了多个图形开发界面的库,这篇文章主要给大家介绍了关于Python学习开发之图形用户界面的相关资料,需要的朋友可以参考下
    2021-08-08
  • Pandas实现groupby分组统计的实践

    Pandas实现groupby分组统计的实践

    本文主要介绍了Pandas实现groupby分组统计的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Python中*args和**kwargs的作用

    Python中*args和**kwargs的作用

    *args和**kwargs,以及单独的*,**到底是啥作用呢?原理是啥呢?读完这篇文章你就彻底明白了,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 详解使用Selenium爬取豆瓣电影前100的爱情片相关信息

    详解使用Selenium爬取豆瓣电影前100的爱情片相关信息

    这篇文章主要介绍了详解使用Selenium爬取豆瓣电影前100的爱情片相关信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 解决csv.writer写入文件有多余的空行问题

    解决csv.writer写入文件有多余的空行问题

    今天小编就为大家分享一篇解决csv.writer写入文件有多余的空行问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • keras的三种模型实现与区别说明

    keras的三种模型实现与区别说明

    这篇文章主要介绍了keras的三种模型实现与区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python单元测试工具doctest和unittest使用解析

    Python单元测试工具doctest和unittest使用解析

    这篇文章主要介绍了Python单元测试工具doctest和unittest使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论