Python greenlet模块的使用

from greenlet import greenlet
# -*- coding: utf-8 -*-
from greenlet import greenlet
#定义一个函数
def test1():
    print("test1 begin")
    gr2.switch()
    print("test1 end")


#定义一个函数
def test2():
    print("test2 begin")
    gr1.switch()
    print("test2 end")

"""
gr1=greenlet(test1),创建一个协程对象gr1,其参数是函数test1,也就是该协程运行的时候,执行的是该函数test1
gr2=greenlet(test2),创建一个协程对象gr1,其参数是函数test2,也就是该协程运行的时候,执行的是该函数test2
两个协程对象创建以后,并不马上执行,需要程序主动地调度才能执行起来,这个调度函数就是协程对象的成员函数switch.
当有协程被调度时,另一个协程就会被挂起,直到那个协程运行完毕,,再主动切换到该挂起的协程才会继续运行
该调度的输出内容分析:
gr1.switch() 主动地调度协程gr1,因此进入到test1中,输出print("test1 begin"),但在函数内执行到gr2.switch()时,
gr1挂起,切换到gr2协程中,从而进入test2中,输出print("test2 begin"),再次遇到gr1.switch(),gr2挂起,切换到
gr1中,继续从挂起的位置,开始执行,输出print("test1 end"),因此协程gr1执行完毕,但是gr2没有其他的程序主动切换到gr2,
因此gr2还是处于挂起的状态,因此print("test2 end")不会输出,因此整体的输出内容如下:
test1 begin
test2 begin
test1 end
"""
#创建两个greentlet对象:gr1,gr2
gr1=greenlet(test1)
gr2=greenlet(test2)
#调度gr1执行,gr1.switch() 主动地调度协程gr1
gr1.switch()

 

输出结果如下:

D:\python3-code\Scripts\python.exe D:/python3-code/eventlet_model.py
test1 begin
test2 begin
test1 end

Process finished with exit code 0

要想test2 end也输出来的话,需要在test1函数的print("test1 end"),下面,再新增一条gr2.switch()

from greenlet import greenlet
#定义一个函数
def test1():
    print("test1 begin")
    gr2.switch()
    print("test1 end")
    gr2.switch()

#定义一个函数
def test2():
    print("test2 begin")
    gr1.switch()
    print("test2 end")

 

输出内容如下:

D:\python3-code\Scripts\python.exe D:/python3-code/eventlet_model.py
test1 begin
test2 begin
test1 end
test2 end

Process finished with exit code 0

  

posted @ 2021-04-16 17:07  一切都是当下  阅读(312)  评论(0编辑  收藏  举报