学习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)直接内存存取完成的。我把知乎该条回答复制到了我的博客园,以便复习查看点击这里

明白了这个,也就明白了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执行,以达到并发执行的效果。

python 选择题 多线程_python多线程一些知识点梳理相关推荐

  1. python 选择题 多线程_python多线程练习题

    python多线程练习题 多线程练习题目,涉及知识点较多,属于很好的练习题. 题目要求 通过多线程实现类似linux中的>>功能,也就是将日志记录到指定的文件中. 题目分析 基本为main ...

  2. python线程唤醒_python 多线程

    python 多线程 真正的多线程吗? 对于多核处理器,在同一时间确实可以多个线程独立运行,但在Python中确不是这样的了.原因在于,python虚拟机中引入了GIL这一概念.GIL(Global ...

  3. python如何使用多线程_Python多线程与多线程中join()的用法

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置 ...

  4. python多线程_Python多线程和队列结合demo

    每周一07:22,准时为你充电 一.使用场景 大家都知道python的多线程不是真正的多线程,但是对于io类型的任务,多线程还是能发挥作用的.那么多个线程之间是如何进行变量共享的呢,很多时候我们可以借 ...

  5. python守护多线程_Python多线程Threading、子线程与守护线程实例详解

    线程Threading: python中多线程需要使用threading模块 线程的创建与运行: 1.直接调用threading的Thread类: 线程的创建:线程对象=thread.Thread(t ...

  6. python 接口测试多线程_python多线程测试接口性能,就是这么简单

    除了使用性能测试工具进行性能测试,我们也可以直接用python多线程进行性能测试. 下面,使用这几个模块,对一个查询接口做性能测试: requests:发送http请求 json:返回的字符串转换成j ...

  7. python如何使用多线程_python多线程应用中的详细介绍

    python多线程在应用的时候有不少的事情需要重点的注意.其实只要掌握这些相关的技术段就能保证这个应用的完整.下面我们来看看具体是需要如何进行操作. 今天看了近一天关于多线程的应用中,如何安全调用py ...

  8. python多线程_python多线程:控制线程数量

    背景 前段时间学习了python的多线程爬虫,当时爬取一个图片网站,开启多线程后,并没有限制线程的数量,也就是说,如果下载1000张图片,会一次性开启1000个子线程同时进行下载 现在希望控制线程数量 ...

  9. python线程创建对象_python 多线程(一)

    (一) 线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程.当一个程序运行时,内部可能包含多个顺序执流,每个顺序执行流就是一个线程. 进程和线程 ...

最新文章

  1. ValueError: check_hostname requires server_hostname解决方法
  2. 存储基础知识一 主要技术DAS、SAN、NAS
  3. 2021年8月最新sci-hub可用网址,高速稳定
  4. 子网划分详解与子网划分实例
  5. 关于eclipse项目红色感叹号的解决办法
  6. 3==num VS num==3
  7. jmeter报“msg“:“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“的解决方法
  8. iOS的5种图片缩略技术以及性能探讨
  9. Win10操作系统备份与恢复篇·Windows10操作系统如何使用微PE实现备份与恢复
  10. Mac 从零搭建Android开发环境记录以及提高效率软件推荐
  11. python 样条曲线_用SymPy构造符号插值样条曲线
  12. NeoKylin(linux)操作系统基本操作(自用)
  13. 关于IOS证书过期的问题
  14. 解决winform中的panel重绘闪烁问题
  15. matplotlib在一张图中画两条线
  16. OpenGrok简单使用
  17. 磊科路由器dns服务器老要修复,路由器dns异常解决方法
  18. 【10月31日】机器学习实战(二)决策树:隐形眼镜数据集
  19. Mendix助力工业数字化 :“智能制造百家讲堂”问题回顾
  20. 字体设计:五种常用的字体修改方法,让你的文字更好看

热门文章

  1. deploy service on swarm
  2. silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)
  3. 如何处理海量数据(上):从并发编程到分布式系统
  4. 《易学Python》——第6章 类与面向对象编程 6.1 类是什么
  5. Selenium2Lib库之鼠标事件常用关键字实战
  6. 初涉SQL Server性能问题(3/4):列出阻塞的会话
  7. 数学建模之图像处理---颜色建模
  8. 微信基础服务肯定不收费
  9. pcre库文件的安装
  10. oracle 查询reference,ORACLE高级查询之MODEL PART3