python 协程-python协程使用

线程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编程

发表评论 X

电子邮件地址不会被公开。 必填项已用*标注

姓名不能为空
填写正确的email