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

        

     

  • 相关阅读:
    一个新的Activity跳转到带有Framgment的Activity页面
    安卓图片下载及存储
    安卓4.0以上 UDP 发送端
    安卓 service 后台运行,activity 启动和停止service
    安卓 BaseAdapter ListView和Button
    安卓点击两次返回键退出程序
    安卓 surfaceview 添加点击事件
    Mybatis
    Cookie
    AJAX原生代码
  • 原文地址:https://www.cnblogs.com/otome/p/12391512.html
Copyright © 2011-2022 走看看