Python 多任务(协程) day1

  1. 比线程所需的资源更少
  2. 可以用yield 实现多任务,其实是并发,但速度很快,相当于同时进行
    import time
    
    def test1():
        while True:
            print('——1——')
            yield
    
    def test2():
        while True:
            print('——2——')
            yield
    def main():
        t1= test1()
        t2= test2()
        while True:
            next(t1)
            next(t2)
    
            
    if __name__ == '__main__':
        main()
    

      

  3. 可以用 greenlet 来执行, greenlet 其实对yield的更高级封装
    import time
    import greenlet
    
    def test1():
        while True:
            print("——1——")
            g2.switch()
    
    def test2():
        while True:
            print("——2——")
            g1.switch()
    
    g1= greenlet.greenlet(test1)
    g2= greenlet.greenlet(test2)
    
    g1.switch()
    

      

  4. 虽然 greenlet 也可以实现多任务,但还是用 gevent ,因为如果用 greenlet ,函数里如果延时,那么下个指令就不会执行,但 gevent 遇到延时时会自己切换任务,而且是自己的延时  gevent.sleep()
    但是如果已经写好了实在不想换,在最前面加 monkey.patch_all() 这样就可以用 time.sleep() 了,不过要在前面from gevent import monkey,不能单纯的导入gevent 不然会报错
  5. 到最后依然需要用 join来等待结束,但可以用joinall(列表)来代替每一个join
    import gevent
    import time
    from gevent import monkey
    
    monkey.patch_all()
    def f1(n):
        for i in range(n):
            print(gevent.getcurrent(),i)
            time.sleep(0.5)   # 在写入monkey.patch_all()后 可以代替geven.sleep()
            # gevent.sleep(0.5)
    
    def f2(n):
        for i in range(n):
            print(gevent.getcurrent(),i)
            time.sleep(0.5)
            # gevent.sleep(0.5)
    
    def f3(n):
        for i in range(n):
            print(gevent.getcurrent(),i)
            time.sleep(0.5)
            # gevent.sleep(0.5)
    
    print("——1——")
    g1 = gevent.spawn(f1,5)
    print("——2——")
    g2 = gevent.spawn(f2,5)
    print("——3——")
    g3 = gevent.spawn(f3,5)
    
    # g1.join()   可以用joinall代替
    # g2.join()
    # g3.join()
    gevent.joinall([
        gevent.spawn(f1,5),
        gevent.spawn(f2,5),
        gevent.spawn(f3,5),
        ])
    

      

 

猜你喜欢

转载自www.cnblogs.com/otome/p/12391512.html