python 协程-python协程使用

    SEO基础 wuya 118次浏览 已收录 0个评论

    线程GIL

    • GIL:Global Interpreter Lock
    • GIL锁不是python的特性,而是CPython解析器的特性
    • GIL本质上是一个全局的排它锁
    • 耗时测试示例:
      from threading import Thread
      import time
      
      def loop():
          i = 0
          for _ in range(100000000):
              i += 1
      
      def test1():
          # 顺序执行两个线程:没有调度
          start_time = time.time()
          t1 = Thread(target=loop)
          t1.start()
          t1.join()
          t2 = Thread(target=loop)
          t2.start()
          t2.join()
          end_time = time.time()
          print('Total time:', end_time-start_time)
          
      def test2():
          # 同时执行两个线程:有调度,不必上面快多少,甚至更慢
          start_time = time.time()
          t1 = Thread(target=loop)
          t2 = Thread(target=loop)
      
          t1.start()
          t2.start()
      
          t1.join()
          t2.join()
          end_time = time.time()
          print('Total time:', end_time - start_time)   
          
      if __name__ == '__main__':
          # 15.877496480941772
          # 15.510928630828857
          # 15.408769845962524
          test1()
          # 14.800537109375
          # 14.566408157348633
          # 14.816517114639282
          # test2()    

    协程简介

    • 说明:协程可以理解为人为的控制函数的调用和执行
    • 优点:
      • 执行效率极高,没有线程切换的开销
      • 没有线程锁的限制,阻塞自动切换

    生成器方式

    • 说明:协程可以通过生成器的yieldnext方法相关配合实现
    • 示例:
      • 单向传值:yield+next
      • 双向传值:yield+send
      • 生产者-消费者

    greenlet方式

    • 说明:greenlet就是底层实现了原生协程的C扩展库
    • 示例:手动切换,可以传参
    • 练习:实现生产者消费者

    学海无涯 , 版权所有丨如未注明 , 均为原创丨转载请注明python 协程-python协程使用
    喜欢 (0)
    发表我的评论
    取消评论
    表情 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址