• 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-codeScriptspython.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-codeScriptspython.exe D:/python3-code/eventlet_model.py
    test1 begin
    test2 begin
    test1 end
    test2 end
    
    Process finished with exit code 0
    

      

  • 相关阅读:
    A/B-test
    LDA概率主题模型
    减肥经验帖
    wide and deep
    利用责任链模式设计一个拦截器
    分享几个 SpringBoot 实用的小技巧
    「造个轮子」——cicada 设计一个配置模块
    「造个轮子」——cicada 源码分析
    「造个轮子」——cicada(轻量级 WEB 框架)
    强如 Disruptor 也发生内存溢出?
  • 原文地址:https://www.cnblogs.com/potato-chip/p/14667865.html
Copyright © 2020-2023  润新知