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. 让瘫痪失语患者「说话」,脑机接口首次从大脑活动解码完整句子,登上新英格兰医学杂志...
  2. 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
  3. OPA 3 - thirdParty Qunit.js and IFrame load logic
  4. UNIX网络编程笔记(3):简单的并发服务器
  5. 一篇关于web.xml配置的详细说明(一)
  6. 自动化系统计算机网络期末考试题,模拟试卷_计算机网络试题B-自动化-孙璐
  7. 判断是否是微信浏览器JavaScript代码
  8. struts2 mysql配置文件路径_Struts2(四)Struts2配置文件的配置
  9. 集群节点列表编辑程序
  10. python3未配置_python3安装文件遇到ssl未安装问题
  11. Django 框架篇(七) : 中间件 以及 5种方法
  12. office2019 使用
  13. 桌面有u盘符计算机里没有了,教你电脑不显示u盘盘符怎么办
  14. Ubuntu安装tftpd服务器
  15. AI产业链的划分,主要可分为基础层、技术层和应用层
  16. 跟卖亚马逊跨境电子商务ERP
  17. IGRP和EIGRP为什么是距离矢量协议
  18. Nvidia Xavier Nx平台PCIE速率调整调试记录
  19. 大规模优化方法(一)
  20. DLNA介绍(包括 UPnP)

热门文章

  1. 点击按钮显示谷歌地图
  2. .中英文系统底层编码导致乱码问题
  3. 虚拟化数据中心服务器硬件配置建议
  4. 【原创·教程·连载】Microsoft SQL Server 2008 Reporting Services应用系列(一)安装篇...
  5. Outlook addon CommandBarButton picture 的不透明效果解决方案
  6. symfony小练习-表白墙
  7. linux web服务器,防火墙iptables最简配置
  8. 转:测试部工作不受重视怎么办?
  9. 时间源服务器|授时仪|GPS时钟同步系统
  10. PHP isset()与empty()的使用区别详解