• 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),
          ])
      

        

     

  • 相关阅读:
    扩展的friend语法
    常量表达式
    字符串过滤,排序输出数字的问题
    decltype类型声明- 现代C++新特性总结
    auto类型-现代C++新特性
    指针相关总结2
    指针相关总结1
    发现XMind一个超级牛逼的功能
    空类指针为什么可以调用类的成员函数 以及 A(){}和A();
    SSAS父子层次结构的增强-UnaryOperatorColumn属性
  • 原文地址:https://www.cnblogs.com/otome/p/12391512.html
Copyright © 2020-2023  润新知