- 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()
协程简介
- 说明:协程可以理解为人为的控制函数的调用和执行
- 优点:
- 执行效率极高,没有线程切换的开销
- 没有线程锁的限制,阻塞自动切换
生成器方式
- 说明:协程可以通过生成器的
yield
及next
方法相关配合实现 - 示例:
- 单向传值:
yield+next
- 双向传值:
yield+send
- 生产者-消费者
- 单向传值:
greenlet方式
- 说明:greenlet就是底层实现了原生协程的C扩展库
- 示例:手动切换,可以传参
- 练习:实现生产者消费者
标签: python
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~