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

作者:小飞侠v科比 时间:2023-02-23 04:07:25 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/kai46385076/article/details/100058846

标签:Python,协程,yield,greenlet
0
投稿

猜你喜欢

  • asp.net中通过ALinq让Mysql操作变得如此简单

    2024-01-21 06:53:41
  • Centos5.x下升级python到python2.7版本教程

    2023-04-15 13:50:07
  • python计算圆周率pi的方法

    2022-09-24 21:08:14
  • python入门语句基础之if语句、while语句

    2023-08-14 01:22:55
  • CodeIgniter连贯操作的底层原理分析

    2024-05-02 17:15:11
  • MySQL怎么给字符串字段加索引

    2024-01-25 10:19:57
  • python如何基于redis实现ip代理池

    2022-11-05 20:49:08
  • 图像检索之基于vlfeat实现SIFT特征

    2021-11-18 13:13:40
  • 在Ubuntu使用SQL Server创建Go应用程序的图文教程

    2024-01-15 10:50:50
  • Django框架会话技术实例分析【Cookie与Session】

    2021-06-24 03:41:53
  • 关于Tensorflow中的tf.train.batch函数的使用

    2023-11-04 19:49:54
  • Python3爬虫带上cookie的实例代码

    2021-11-10 18:06:58
  • JS实现数字格式千分位相互转换方法

    2023-08-31 08:24:48
  • python根据照片获取地理位置及泄露防御

    2022-03-23 11:16:54
  • Python字典对象实现原理详解

    2023-06-11 01:53:21
  • 基于Python批量生成指定尺寸缩略图代码实例

    2021-12-15 14:58:48
  • python-opencv-cv2.threshold()二值化函数的使用

    2022-12-31 23:00:12
  • 巧用Dreamweaver MX设计导航栏特效

    2009-07-10 13:17:00
  • javascript insertAfter()定义与用法示例

    2024-04-26 17:11:23
  • ASP编程常用的分页代码

    2007-09-11 13:57:00
  • asp之家 网络编程 m.aspxhome.com