Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

25 | 答疑(二):GIL与多线程是什么关系呢?

使用多线程或Asyncio加速
使用多进程加速
例子:用多线程爬取网站内容
伪并行
同一时刻只能有一个线程运行
示例:社交网站后台操作
高度的抽象、分离与简化
修改函数行为
len(x)返回的是2
无限嵌套的列表
I/O密集型任务
CPU密集型任务
Python多线程
GIL
装饰器
x
问题四:多进程与多线程的应用场景
问题三:GIL与多线程的关系
问题二:装饰器的宏观理解
问题一:列表self append无限嵌套的原理
答疑(二):GIL与多线程是什么关系呢?

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
不知不觉中,我们又一起完成了第二大章进阶篇的学习。我非常高兴看到很多同学一直在坚持积极地学习,并且留下了很多高质量的留言,值得我们互相思考交流。也有一些同学反复推敲,指出了文章中一些表达不严谨或是不当的地方,我也表示十分感谢。
大部分留言,我都在相对应的文章中回复过了。而一些手机上不方便回复,或是很有价值很典型的问题,我专门摘录了出来,作为今天的答疑内容,集中回复。

问题一:列表 self append 无限嵌套的原理

先来回答第一个问题,两个同学都问到了,下面这段代码中的 x,为什么是无限嵌套的列表?
x = [1]
x.append(x)
x
[1, [...]]
我们可以将上述操作画一个图,便于你更直观地理解:
这里,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
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • 大王叫我来巡山
    第一次完全明白GIL,照顾方便性的同时在实现上偷了懒,但是本身设计就是解决特定问题,而不是解决所有问题的,但是随着受众的增多,是会发展变化,就行脚本语言中引入类型系统,编译型语言中引入类型推断,都是为了语言更好的发展。

    作者回复: 说得很对

    2019-11-29
    5
  • new
    目前项目不用python看过了似乎是懂了,过一段时间又啥都想不起来了,学习最好的方式是边学边用,可是没机会用。感觉老师确实底蕴深厚呀,好多东西对老师来说似乎很简单,比如图,有向图,有向边,我都不懂呀,感觉差的好多好多

    作者回复: 平时多注重实践,积累,这些都是水到渠成

    2019-07-09
    5
  • 晓冰
    老师你好,python同一时刻只能执行一个线程,那么多核cpu的场景下就没办法充分利用硬件资源,我们在生产环境中是怎么玩的呢?

    作者回复: 实际生产环境都是几万台机子一起运作

    2019-08-15
    2
    3
  • 杰洛特
    请教老师,对于网络请求等待较多的场景,是不是也参考I/O密集型任务,采用多线程好一些?

    作者回复: 嗯嗯

    2019-08-07
    1
  • TKbook
    看到这,终于搞明白多线程和协程的差异,感谢老师。
    2019-07-05
    3
    21
  • Paul Shan
    我个人认为,线程是CPU调度的最小单元,但是Python,因为GIL的存在让并行无法在线程这个粒度上运行,只好在更大粒度的进程上并行,进程切换的代价比线程大,Python并行的效率低于支持多线程同时在多核上跑的语言。协程是在一个线程内调度资源,无法实现并行,但对IO操作有效,也就是说可以并发利用CPU和IO资源,但是无法并行利用多个CPU资源。我的观点是否正确,请老师指正。
    2019-11-22
    1
    8
  • 爱学习的小迪
    在多核CPU的场景下,多线程可以充分利用CPU,实现并行;但是Python由于存在GIL,要求同一个时刻只能有一个线程运行,从而导致无法利用多核CPU的优势,也就是造成了“伪并行”; GIL只存在于CPython解释器中。主要出于Python的内存管理和CPython大量使用线程不安全的C库的角度来考虑引入GIL
    2022-07-03
    2
  • yshan
    继续加油,虽然学习了后面,前面有些已经忘记了,还是需要多复习和实践
    2019-07-05
    2
  • min
    老师,前次讲的垃圾回收之分代回收,系统默认第二代和第三代阈值为10;对于一个系统来说,这么多全局变量,那么第二代和三代不就在一直很高频的回收?
    2019-07-05
    1
    1
  • 钱鹏 Allen
    多线程并不代表cpu同时让多个线程在同一时间一起跑,而是每次执行一个任务
    2022-11-21归属地:上海
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部