python 为什么不能利用多核 CPU 

GIL 其实是因为在 python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁。 

1、最开始时候设计GIL是为了数据安全
python为了数据安全设计了这个 GIL。 
2、每个 CPU在同一时间只能执行一个线程: 
(在单核 CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。 但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生( 
2)在 python多线程下,每个线程的执行方式如下: 
1、获取GIL

2、执行代码直到sleep或者是 python虚拟机将其挂起。 
3、释放 GIL

为什么有时候多线程效率低于单线程? 

1、如上我们可以知道,在 python中想要某个线程要执行必须先拿到 
GIL这把锁,且 python只有一个 GIL,拿到这个 GIL才能进入 CPU执行, 
在遇到 
I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 
100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval
来调整)。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython 
进程做为一个整体,同一时间只会有一个获得了 
GIL 的线程在跑,其它的线程都处于等待状态等着 
GIL 的释放。 
2、而每次释放 GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于 
GIL锁存在,python里一个进程永远只能同时执行一个线程 (拿到 GIL的线程才能执行 
),这就是为什么在多核 
CPU上, python的多线程效率并不高。


python
的多线程是否就完全没有用了呢?

相同的代码,为何有时候多线程会比单线程慢,有时又会比单线程快? 
这主要跟运行的代码有关: 
1、 CPU密集型代码 
(各种循环处理、计数等等 ),在这种情况下,由于计算工作多, ticks计数很快就会达到 
100阈值,然后触发 GIL的释放与再竞争 (多个线程来回切换当然是需要消耗资源的),所以 python下的多线程遇到 CPU密集型代码时,单线程比多线程效率高。 
IO密集型代码 (文件处理、网络爬虫等 ),多线程能够有效提升效率 
(单线程下有 IO操作会进行 IO等待,造成不必要的时间浪费,而开启多线程能在 
线程 
A等待时,自动切换到线程 
B,可以不浪费 
CPU的资源,从而能提升程序执行效率 
)。

进行 IO密集型的时候可以进行分时切换 所有这个时候多线程快过单线程( 
5)如果 python想充分利用多核 CPU,可以采用多进程, 每个进程有各自独立的 
GIL,互不干扰,这样就可以真正意义上的并行执行,所以在 
python中,多进程的执行效率优于多线程 
(仅仅针对多核 CPU而言 )。 
所以在多核 CPU下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率。

转载于:https://www.cnblogs.com/bo-test1985-dd/p/9116132.html

python多线程不能利用多核cpu,但有时候多线程确实比单线程快。相关推荐

  1. python多线程多个cpu_为什么python的多线程不能利用多核CPU?

    为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GI ...

  2. python GIL 全局锁,多核cpu下的多线程性能究竟如何?

    python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...

  3. 如何利用多核CPU提高虚拟现实性能?

    虚拟现实引领新时代令人惊喜的新体验,但也带来了各种新的挑战.其中之一就是虚拟现实应用"耗能"问题. 虚拟现实挑战了图形和仿真技术,以至于创造优秀虚拟现实体验的硬件需求成为日前热点. ...

  4. mysql如何使用多核cpu_利用多核 CPU 实现并行计算

    利用多核 CPU 实现并行计算 由 学院君 创建于1年前, 最后更新于 3个月前 版本号 #2 5814 views 2 likes 1 collects 开始之前,我们先澄清两个概念,「多核」指的是 ...

  5. 如何利用多核CPU来加速你的Linux命令

    如何利用多核CPU来加速你的Linux命令 原文出处: rankfocus   译文出处: 外刊IT评论 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并 ...

  6. python3 多线程_图解|为什么 Python 多线程无法利用多核

    (给Python开发者加星标,提升Python技能) 来源:后端技术指南针 1.全局解释锁 如题: Python的多线程为什么不能利用多核处理器? 全局解释器锁(Global Interpreter ...

  7. python多核运行程序_python单进程能否利用多核cpu的测试结论

    在很早的时候,就听网上的文章说: python有GIL,所以在单进程内,即使使用多线程也无法利用到多核的优势,同一时刻,python的字节码只会运行在一个cpu上. 以前也是奉为真理,直到今天在对自己 ...

  8. Matlab多核CPU并行和多线程

    简介 这里需要明白的概念有:多核.多进程.多线程.并行计算.并发计算的区别. 什么是多核 在计算机设计早期,为了响应更多计算性能的需要,单处理器系统发展成为多处理器系统.更现代的.类似的系统设计趋势是 ...

  9. 测试单核cpu和多核cpu执行java多线程任务的效率

    这篇文章就是验证一件事: 只有多核cpu的计算机执行多个线程时才会提高效率(并行),单核cpu执行多个线程不会提高效率(并发). 我选择的任务是:冒泡排序长度30000的int数组 单线程下 我们先测 ...

最新文章

  1. Spring之事务管理配置
  2. K3ERP连接数据库问题
  3. 20100506 学习记录:grdview添加新的一行数据
  4. 游戏让你额外多活10年#团队分享文字版
  5. Github上Fork部署应用程序
  6. 桔子浏览器电脑版如何登录 桔子浏览器PC版账号登录教程
  7. MySQL--REPALCE INTO操作
  8. node 报错 throw er; // Unhandled 'error' event 解决办法
  9. HTTP协议 (三) 压缩
  10. 电商促销海报设计技巧!
  11. 用GAN炼制长生不老药,这么玄幻的公司竟然能拿到药企投资
  12. 如何提高微信公众号流量主收入
  13. thikPHP框架部署
  14. Linux内核分析学习心得
  15. python 单向链表实现快速排序_若干排序算法的Python实现方法及原理
  16. Atitit zxing二维码qr码识别解析
  17. 5369. 统计作战单位数
  18. SuperMemo UX 添加笔记 Ctrl+H
  19. Kali--社会工程学工具-social engineering toolkit(SET)
  20. flappybird原理解析 JQuery版本

热门文章

  1. Codeforces Round #552 (Div. 3) —— A. Restoring Three Numbers
  2. 【Linux】一步一步学Linux——dir命令(了解)(25)
  3. 安卓蓝牙键盘按键映射_多设备无缝切换 雷柏XK100无线蓝牙轻薄键盘评测
  4. C语言ODBC方式连接DM数据库
  5. 每天一道LeetCode-----将数字集转成字母集,计算有多少种转换方式
  6. 防火墙(12)——查看协议被连接的次数、通过连接状态来写规则
  7. K个一组翻转链表—leetcode25
  8. python包接口,Typetalk聊天API的python接口包
  9. exe的dll加载过程
  10. 三种sqrt函数实现