• 协程


    一.协程

      协程就是在线程中开线程,由用户自己控制,也叫微线程,必须在单线程中实现并发

    二.生成器版协程

      使用yield保持状态,使用next()切换任务,并不能合理利用I/O阻塞并发,提升效率.

    import time
    # 没有节省时间
    def f1():
        for i in range(10):
            time.sleep(0.2)
            print(i)
            yield           # 生成器可以帮忙记录状态
    
    def f2():
        g = f1()
        for i in range(10):
            next(g)             # 你一下,我一下    类似于切换任务
            print(i)
    
    f1()
    f2()
    生成器版协程

    三.greenlet模块版协程

      greenlet模块帮助我们保持状态+任务切换

    import time
    from greenlet import greenlet  # 了解
    
    def f1():
        print("f1")
        g2.switch()         # 保持状态,然后切换
        time.sleep(1)
        print("f1")
        g2.switch()
    
    def f2():
        print("f2")
        g1.switch()
        time.sleep(2)
        print("f2")
    
    g1 = greenlet(f1)
    g2 = greenlet(f2)
    g2.switch()         # switch() 也可以传参,在第一次的时候传参就行 保持状态 + 切换任务
    greenlet模块协程

    1.greenlet模块中的方法

      g = greenlet(function)  创建一个对象

      g.switch(参数)  用于保持状态和切换任务

    四.gevent模块版协程

      gevent模块帮助我们模拟操作体统来切换任务,

    from gevent import monkey;monkey.patch_all
    import gevent
    
    def f1():
        print(1)
        # print(threading.current_thread().getName())
        time.sleep(1)
        print("f1")
    
    def f2():
        print(2)
        # print(threading.current_thread().getName())
        gevent.sleep(2)
        print("f2")
    
    g1 = gevent.spawn(f1)
    g2 = gevent.spawn(f2)
    
    gevent.joinall([g1,g2])  # g1.join()  g2.join() 等效
    gevent模块版协程

    1.gevent模块中的方法

      g = gevent.spawn(function)  创建一个greenlet对象

      gevent.joinall([g])  和g.join() 一样,方便一次使用多个join()

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/q767498226/p/10268988.html
Copyright © 2020-2023  润新知