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