python多线程一些知识点梳理

学习python的进程和线程以来,对这两个概念一直都处于模糊状态,所以决定花点时间好好学习一下这块知识。以下是我自己在学习过程中形成的一些疑问以及搜集的一些相应的比较好的答案,整理如下,方便复习自查。

我们可能听过这样的说法:由于GIL的存在,在多个CPU情况下python的多线程是个鸡肋的存在。至于为什么会这样,下文转载的一篇博文中有比较详细的解说。

虽然python多线程鸡肋,但是在阅读python cookbook相关章节时,看到这么样的描述:“GIL带来的最明显的影响就是多线程的python程序无法充分利用多个CPU核心带来的优势(即,一个采用多线程技术的计算密集型应用只能在一个CPU上运行.....如果我们的程序主要是在做I/O操作,比如处理网络连接,那么选择多线程技术常常是一个明智选择。因为他们大部分时间都花在等待对方连接上了)”(来自python cookbook中文版第三版12.9小节,如何规避GIL带来的限制)。其实对于这句话的理解,同样在下面转发的博文中有解释,这里只是用一个更权威的描述来佐证博文中的论述。

所以说,多个CPU情况下,对于I/O密集型操作,使用多线程技术是有益无害的,但是,一旦某个线程是CPU密集型操作,那么该线程就可能长时间占用GIL,导致其他线程长期等待,也无法发挥多个CPU带来的优势,此时应该尽量使用多进程,而不是多线程。既然python多线程仍有用武之地,所以还是有必要好好学习一下这块知识。

I/O操作是否会一直占用CPU?

这个问题在刚开始学习python线程和五大I/O模型的时候困惑了我一段时间,因为我的认识中,所有程序都是由CPU由上到下一条一条执行的。但是在学习I/O模型时,比如下图的异步I/O模型,图左侧aio_read函数发出一个system call之后就return了,然后CPU接着搞事情,但是同时图右侧又注明wait for data,什么鬼,谁在等?难道CPU能分身不成?虽然猜测应该是有别的外设(好在曾经搞过嵌入式,知道外设这概念)在处理数据发送和接收,然后通过中断通知CPU处理结果,但是没有正经理论支撑还是放心不下,于是知乎了一下,果然还是得到了比较满意的答案,总的来说就是IO所需要的CPU资源非常少。大部分工作是分派给DMA(Direct Memory Access)直接内存存取完成的。我把知乎该条回答复制到了我的博客园,以便复习查看点击这里

007U1XJ8gy1g5lfv7hwhoj30fn09775g.jpg

明白了这个,也就明白了CPU密集型和I/O密集型在使用线程中的区别,CPU密集型代码段需要一直占用CPU,而I/O密集型代码,可以在进行I/O操作的时候让出CPU控制权,而I/O操作的过程是交给DMA处理的,并不需要CPU直接参与。

多核处理器,一个进程的多个线程能否在不同CPU中并行运行?

之前一直以为多核处理器每个CPU只能并行执行不同的进程,因为进程是资源分配的最小单位,如果一个进程的不同线程运行在不同CPU,那么线程间通讯应该比较困难,后来觉得如果这样的话,一个进程的多个线程只能在同一个CPU下轮流执行,对于任务不多的情况下,会导致其他CPU在那里空转,实在是浪费资源,百度了很久,都没有得到正面的回答,在StackOverflow上得到一个好一点的回答。

先把结论摆出来,那就是:同一进程的多个线程,是可以在不同CPU并行(不是并发)执行的。形象一点就是说,假设有一个进程的两个线程A和B,以及两个核CPU1和CPU2,操作系统可以把线程A分配给CPU1执行,同时线程B分配给CPU2执行,以达到并发执行的效果。

原文地址点击这里

007U1XJ8gy1g5l6ryem8oj30kl07mjs5.jpg

007U1XJ8gy1g5l7ayr7klj30kh04zjrp.jpg

上面两个回答来自同一个提问,简单概括一下第一个回答,意思就是一个包含多个线程的进程,操作系统会决定哪个线程在哪个CPU执行(通过机智的试探法来提升负载平衡和优化能耗等)。第二个回答大概意思是,”操作系统不太在意线程来自哪个进程,它通常把线程安排给不同核的处理器,不管线程来自哪个进程,这可以使得一个进程的四个线程在同一时刻运行“。

python的GIL全局锁是什么,为什么说它导致了python多线程的鸡肋,如何规避这种不利影响?

本来是打算自己查资料做实验总结的,后来发现这个话题已经有相当多优秀的博文可供参考,看着别人的文章,发现自己重新造轮子有点多此一举,而且不自信能写出人家的深度,不如直接拿来主义,哦不,是借鉴参考一下。果不其然,有时候做做伸手党,还是emmm......真香...。

好了,直接放上一篇看完很受益的博文的链接,方便以后复习时查看。

博文链接

关于该博文中说到的不执行任何I/O操作的CPU密集型线程,会一直占用GIL,导致其他I/O密集型线程进入无尽的等待,这个说法应该是值得商榷的,在看《python cookbook》12.9.2章节的时候,页脚有这么一段注释,我把它贴出来:

pythoncookbook

也就是说,当CPU密集型线程占用GIL后,python解释器在执行了一定数量的python代码后会主动释放GIL,以便让其他线程得到执行的机会,所以博文中所述的CPU密集型线程会一直占用GIL的说法是有疑点的,不过博文中是使用的python2,而cookbook是基于python3。

转载于:https://www.cnblogs.com/olivertian/p/11290133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、判断题: Python语言是一种高级语言。【对】 2、多选题: Jupyter notebook中运行单元格的方法有哪几种?( ) 选项: A:Enter B:Shift+Enter C:Ctrl+Enter D:F5 答案: 【Shift+Enter;Ctrl+Enter】 3、单选题: Jupyter notebook的记事本文件扩展名为:( ) 选项: A:m B:py C:pyc D:ipynb 答案: 【ipynb】 4、判断题: Jupyter notebook 中的助手需要额外安装。答案: 【对】 5、单选题: Python安装扩展库常用的是( )工具 选项: A:setup B:update C:pip D:run 答案: 【pip】 6、单选题: 关于Python语言的注释,以下选项中描述错误的是:( ) 选项: A:python语言有两种注释方式:单行注释和多行注释 B:python语言的单行注释以#开头 C:python语言的单行注释以单引号开头 D:Python语言的多行注释以’’’(三个单引号)开头和结尾 答案: 【Python语言的单行注释以单引号开头】 7、单选题: 以下选项中,不是pip工具进行第三方库安装的作用的是:( ) 选项: A:安装一个库 B:卸载一个已经安装的第三方库 C:列出当前系统已经安装的第三方库 D:脚本程序转变为可执行程序 答案: 【脚本程序转变为可执行程序】 8、单选题: 安装一个库的命令格式是:( ) 选项: A:pip uninstall  B:pip -h C:pip install  D: ip download  答案: 【pip install 】 9、判断题: 标准的缩进格式是Python的语法之一。 选项: A:对 B:错 答案: 【对】 10、多选题: 下列导入第三库的操作中正确的是:( ) 选项: A:import numpy B:import numpy as np C:from matplotlib import pyplot D:from urllib.request import urlopen 案: 【import numpy;import numpy as np;from matplotlib import pyplot;from urllib.request import urlopen】
Python是一种高级编程语言,被广泛用于各种领域的软件开发、数据分析、人工智能和科学计算等。它有许多不同的知识点,下面是一些常见的Python知识点整理: 1. 基本语法:包括变量、数据类型、运算符、条件语句、循环语句等。 2. 函数:定义函数、参数传递、返回值、作用域等。 3. 模块与包:导入模块、使用第三方库、创建和使用自定义包等。 4. 文件操作:读取和写入文件、文件路径操作、异常处理等。 5. 数据结构:列表、元组、字典、集合等。 6. 面向对象编程:类、对象、继承、多态等。 7. 异常处理:捕获和处理异常、使用try-except语句等。 8. 正则表达式:匹配模式、替换字符串等。 9. 迭代器与生成器:迭代对象、生成器函数、yield关键字等。 10. 装饰器:函数装饰器、类装饰器等。 11. 并发编程:多线程、多进程、协程等。 12. 文件操作:读写文件、文件路径操作、文件压缩和解压缩等。 13. 数据库操作:连接数据库、执行SQL语句、操作数据库表等。 14. 网络编程:创建TCP/UDP服务器和客户端、Socket编程等。 15. Web开发:使用框架如Django和Flask进行Web应用开发、处理HTTP请求和响应等。 16. 数据分析与可视化:使用NumPy、Pandas和Matplotlib进行数据处理和可视化。 17. 机器学习:使用Scikit-learn库进行机器学习模型的建立和训练。 18. 数据爬取:使用BeautifulSoup和Scrapy进行网页爬取和数据提取。 19. 测试与调试:编写单元测试、调试程序等。 20. 性能优化:代码优化、内存管理、并行计算等。 这只是Python知识点的一小部分,Python是一门非常丰富的语言,还有很多其他的知识点值得深入学习和探索。 相关问题: 1. Python为什么在数据分析和科学计算领域中广泛使用? 2. Python中的模块和包有什么区别?如何导入和使用它们? 3. Python中的异常处理是怎样工作的?为什么它在编程中很重要? 4. Python中的迭代器和生成器有什么区别?如何使用它们来提高代码效率? 5. Python中的装饰器是什么?如何使用它们来增强函数或类的功能? 6. Python多线程和多进程有什么区别?如何在程序中使用它们? 7. 在Python中如何进行文件的读写操作?如何处理文件路径和异常? 8. 如何使用Python进行数据库操作?如何连接数据库和执行SQL语句? 9. Python中如何进行网络编程?如何创建和使用TCP/UDP服务器和客户端? 10. 如何使用Python进行Web开发?如何使用框架来创建Web应用? 11. Python中如何进行数据爬取和数据处理?如何使用相关的库? 12. Python中如何进行测试和调试?如何编写单元测试和调试程序? 13. 如何使用Python进行性能优化?如何优化代码和内存管理? 14. Python在人工智能领域中有哪些常用的库和框架?如何使用它们来构建机器学习模型?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值