zoukankan      html  css  js  c++  java
  • 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),
          ])
      

        

     

  • 相关阅读:
    大学阶段最后的交流
    JavaScript的一些基础性知识
    CSS的一些总结
    JavaWeb的一些理解
    Java Web之XML基础
    Java基础增强
    反射的理解
    Java网络编程
    Java 中剩下的流以及线程方面的知识
    Java中的流操作
  • 原文地址:https://www.cnblogs.com/otome/p/12391512.html
Copyright © 2011-2022 走看看