1. Python的对线程为什么被说成是鸡肋?

      1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定。

      1.2Python 多线程下,每个线程的执行方式:

        1.2.1获取GIL

        1.2.2执行代码到sleep或者是Python虚拟机将其挂起

        1.2.3释放GIL

    可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。

  2.那么是不是python的多线程就完全没用了呢?

      2.1CPU密集型代码(各种循环处理、计数等等),在这种情况下,ticks计数很快就会达到阈值,然后触发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密集型代码并不友好。

      2.2IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。所以python的多线程对IO密集型代码比较友好。

               

核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低

回到最开始的问题:经常我们会听到老手说:“python下想要充分利用多核CPU,就用多进程”,原因是什么呢?

原因是:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。

所以我们能够得出结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率

原文转自  https://zhuanlan.zhihu.com/p/20953544

作者:一刀捅死大萌德
链接:https://zhuanlan.zhihu.com/p/20953544
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    

转载于:https://www.cnblogs.com/pannyvan/p/6101090.html

Python之多线程相关推荐

  1. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  2. python 选择题 多线程_python多线程一些知识点梳理

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

  3. Python requests 多线程抓取 出现HTTPConnectionPool Max retires exceeded异常

    Python requests 多线程抓取 出现HTTPConnectionPool Max retires exceeded异常 参考文章: (1)Python requests 多线程抓取 出现H ...

  4. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  5. python代码示例下载-Python实现多线程下载脚本的示例代码

    0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法.download() ...

  6. python多线程爬虫实例-python支持多线程的爬虫实例

    python是支持多线程的, 主要是通过thread和threading这两个模块来实现的,本文主要给大家分享python实现多线程网页爬虫 一般来说,使用线程有两种模式, 一种是创建线程要执行的函数 ...

  7. Python之多线程:python多线程设计之同时执行多个函数命令详细攻略

    Python之多线程:python多线程设计之同时执行多个函数命令详细攻略 目录 实现功能 采取方法 应用场景 实现功能 同时执行多个函数命令 采取方法 T1.单个实现 import threadin ...

  8. python进阶 多线程编程 —— threading和queue库实现多线程编程

    python进阶 多线程编程 -- threading和queue库实现多线程编程) 摘要 多线程实现逻辑封装 模型参数选择实例 摘要 本文主要介绍了利用python的 threading和queue ...

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

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

最新文章

  1. php xp不支持,据说PHP5.5发布 不再支持XP和2003
  2. 【前端词典】和媳妇讲代理后的意外收获
  3. Programming Computer Vision with Python (学习笔记五)
  4. 计算 java_两种计算Java对象大小的方法(转)
  5. video怎么重新加载 vue_vue 事件中更改video的src成功,视频不加载
  6. mysql php ajax_PHP 和 AJAX MySQL 数据库实例
  7. 禁用部分radio(实践)
  8. 统计个人已完成的工作量_2020个人年终工作总结怎么写已完成工作?
  9. 【转】group by后使用rollup子句总结
  10. 你写的代码要被 GitHub 存在北极啦!期限是 1000 年!
  11. 客厅计算机笔记本cpu,我的家庭娱乐中心,适合客厅的 HTPC(家庭影院电脑)
  12. iOS7—Day by day—Day16:Decoding QR Codes With AVFoundation
  13. EasyGBS主子码流都为H.265时,切换出现花屏如何解决?
  14. 百度云 不限速 | 2019 最好用下载工具
  15. Canvas 实用API详解
  16. 爱因斯坦思考题(多维穷举)
  17. 计算机技术在现代地球科学中的重要性,浅谈GIS技术在地球科学中的应用.doc
  18. 包含min函数的栈和两个栈实现一个队列
  19. 易语言之ocr自动识别验证码dll文件
  20. Python字典操作大全

热门文章

  1. 基于特征的推荐算法【转】
  2. 16个Linux服务器监控命令
  3. 管道过滤器模式(Pipe and Filter)与组合模式(修改)
  4. WCF之元数据交换 (Metadata Exchange)
  5. [文章存档]Kudu 的 Debug Console 窗口如何查看更多文件
  6. MongoDB9高可用的MongoDB集群
  7. linux查找日志技巧
  8. OpenDayLight Helium实验三 OpenDaylight二层转发机制实验
  9. CSS3 美女动画相框
  10. Python学习笔记——常量和变量