25 | 答疑(二):GIL与多线程是什么关系呢?
景霄
该思维导图由 AI 生成,仅供参考
你好,我是景霄。
不知不觉中,我们又一起完成了第二大章进阶篇的学习。我非常高兴看到很多同学一直在坚持积极地学习,并且留下了很多高质量的留言,值得我们互相思考交流。也有一些同学反复推敲,指出了文章中一些表达不严谨或是不当的地方,我也表示十分感谢。
大部分留言,我都在相对应的文章中回复过了。而一些手机上不方便回复,或是很有价值很典型的问题,我专门摘录了出来,作为今天的答疑内容,集中回复。
问题一:列表 self append 无限嵌套的原理
先来回答第一个问题,两个同学都问到了,下面这段代码中的 x,为什么是无限嵌套的列表?
我们可以将上述操作画一个图,便于你更直观地理解:
这里,x 指向一个列表,列表的第一个元素为 1;执行了 append 操作后,第二个元素又反过来指向 x,即指向了 x 所指向的列表,因此形成了一个无限嵌套的循环:[1, [1, [1, [1, …]]]]。
不过,虽然 x 是无限嵌套的列表,但 x.append(x) 的操作,并不会递归遍历其中的每一个元素。它只是扩充了原列表的第二个元素,并将其指向 x,因此不会出现 stack overflow 的问题,自然不会报错。
至于第二点,为什么 len(x) 返回的是 2?我们还是来看 x,虽然它是无限嵌套的列表,但 x 的 top level 只有 2 个元素组成,第一个元素为 1,第二个元素为指向自身的列表,因此 len(x) 返回 2。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Python中的GIL(全局解释器锁)与多线程的关系是本文讨论的重点。作者解释了GIL的存在与Python多线程的关系,指出虽然Python支持多线程,但实际上多线程是通过线程间的交替执行来实现的,因此并不是真正的多线程并行。此外,文章还涉及了装饰器的宏观理解和多进程与多线程的应用场景。装饰器可以通过自定义的函数或类,在不改变原函数的基础上,改变其功能,从而使代码得到高度的抽象、分离与简化。而在处理CPU密集型任务时,使用多线程是无效的,应该使用多进程;而对于I/O密集型任务,可以优先使用多线程或Asyncio。文章通过解答读者提出的问题,深入浅出地介绍了这些技术概念,为读者提供了清晰的技术指导和应用建议。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》,新⼈⾸单¥59
《Python 核心技术与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(19)
- 最新
- 精选
- 大王叫我来巡山第一次完全明白GIL,照顾方便性的同时在实现上偷了懒,但是本身设计就是解决特定问题,而不是解决所有问题的,但是随着受众的增多,是会发展变化,就行脚本语言中引入类型系统,编译型语言中引入类型推断,都是为了语言更好的发展。
作者回复: 说得很对
2019-11-295 - new目前项目不用python看过了似乎是懂了,过一段时间又啥都想不起来了,学习最好的方式是边学边用,可是没机会用。感觉老师确实底蕴深厚呀,好多东西对老师来说似乎很简单,比如图,有向图,有向边,我都不懂呀,感觉差的好多好多
作者回复: 平时多注重实践,积累,这些都是水到渠成
2019-07-095 - 晓冰老师你好,python同一时刻只能执行一个线程,那么多核cpu的场景下就没办法充分利用硬件资源,我们在生产环境中是怎么玩的呢?
作者回复: 实际生产环境都是几万台机子一起运作
2019-08-1523 - 杰洛特请教老师,对于网络请求等待较多的场景,是不是也参考I/O密集型任务,采用多线程好一些?
作者回复: 嗯嗯
2019-08-071 - TKbook看到这,终于搞明白多线程和协程的差异,感谢老师。2019-07-05321
- Paul Shan我个人认为,线程是CPU调度的最小单元,但是Python,因为GIL的存在让并行无法在线程这个粒度上运行,只好在更大粒度的进程上并行,进程切换的代价比线程大,Python并行的效率低于支持多线程同时在多核上跑的语言。协程是在一个线程内调度资源,无法实现并行,但对IO操作有效,也就是说可以并发利用CPU和IO资源,但是无法并行利用多个CPU资源。我的观点是否正确,请老师指正。2019-11-2218
- 爱学习的小迪在多核CPU的场景下,多线程可以充分利用CPU,实现并行;但是Python由于存在GIL,要求同一个时刻只能有一个线程运行,从而导致无法利用多核CPU的优势,也就是造成了“伪并行”; GIL只存在于CPython解释器中。主要出于Python的内存管理和CPython大量使用线程不安全的C库的角度来考虑引入GIL2022-07-032
- yshan继续加油,虽然学习了后面,前面有些已经忘记了,还是需要多复习和实践2019-07-052
- min老师,前次讲的垃圾回收之分代回收,系统默认第二代和第三代阈值为10;对于一个系统来说,这么多全局变量,那么第二代和三代不就在一直很高频的回收?2019-07-0511
- 钱鹏 Allen多线程并不代表cpu同时让多个线程在同一时间一起跑,而是每次执行一个任务2022-11-21归属地:上海
收起评论