要想把N核CPU的核心全部跑满,就必须启动N个死循环线程。
用 Python 启动与CPU核心数量相同的N个线程,在4核CPU上可以监控到CPU占用率仅有102%,也就是仅使用了一核。
但是用C、C++或Java来改写相同的死循环,直接可以把全部核心跑满,4核就跑到400%,8核就跑到800%。
为什么Python不行呢?
因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。
所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。
不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。

Python的GIL锁相关推荐

  1. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  2. python线程安全_线程,线程安全与python的GIL锁

    在看的过程中,接触到一个名词,一个从学python开始就一直看到,但是从来都是一知半解的名词,心里不开心,必须把它搞明白,对了,这个词就是 GIL.网上搜索了一些资料,粗浅的理解了什么是GIL,自己感 ...

  3. python gil锁存在的意义_对于Python的GIL锁理解

    GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可 ...

  4. python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...

  5. python 对象锁_也许你对 Python GIL 锁的理解是 错的。

    摄影:产品经理甜白与草莓更配~ 我刚到现在这个公司时,听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说:  Python 有 GIL 锁,所以它的多线程实际上是单线程,所以写多线程代码不用考 ...

  6. Cython屏蔽GIL锁实践

    环境: Ubuntu19.10 四核八线程. 题外话,八线程属于超线程概念,程序员不可控制,属于操作系统调度的工作. 基本概念: 什么时候使用并发/并行? 资料中有两种说法: 一种是: 涉及到多核就是 ...

  7. Python培训教程:什么是Python全局解释器锁(GIL)?

    本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...

  8. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  9. python全局解释锁_Python GIL 全局解释性锁介绍

    什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...

最新文章

  1. 2020 年 Java 面试常见 350 题
  2. TikTok广告投放指南(基础入门)
  3. Linux 5.4 LVM RAW 设备 配置的深入研究
  4. 中学计算机教育未得到重视,新时期中学计算机教学现状和发展趋势研究
  5. web前端时间戳转时间类型显示
  6. Linux 常用系统工具与初始化配置
  7. 《JavaScript征途》广泛征集读后感创作者,参与有奖!
  8. 投稿选刊必备,2021较全的国内SCI期刊汇总整理
  9. 网络传输协议–HTTP(一)
  10. GB50174《电子信息系统机房设计规范》福州再掀培训热潮
  11. 什么是gzip?为什么要用gzip?使用gzip的优势和劣势是什么?需要哪些岗位进行配合才能够实现gzip内容的应用?
  12. T410i开机显示fan error修复
  13. Nagios如何配置告警短信?
  14. Spring framework源码 Constants学习
  15. 用 Python 整理 Excel 表格
  16. pdf转换成jpg python_【PyMuPDF和pdf2image】Python将PDF转成图片PNG和JPG
  17. Matlab最实用画图命令整理(包括Print输出SCI论文高清大图!)
  18. 打开WPS或office,提示运行时错误‘424’或 运行错误‘429’,ActiveX部件不能创建对象
  19. python读word文档计算字数,Python 实现word count 简单计算源代码中的字符数、词数、行数。...
  20. 微信公众号开发(一)服务器及接口的配置

热门文章

  1. 单纤光纤收发器a与b怎么放?如何使用光纤收发器的AB端?
  2. 解决win10电脑运行一段时间后,分页缓冲池占用增多,导致内存不足,软件闪退
  3. 打印表格打印机没有反应_一分钟解决:不能打印、文档和表格也打不开
  4. Houdini下的俄罗斯方块(一)
  5. 陪孩子一起学python第二季_陪伴的句子
  6. 用解构主义重塑现代商业与组织形式
  7. Android定位SDK
  8. steam如何缓解服务器压力,上班压力大怎么办,推荐steam上5款发泄专用的游戏
  9. CDC::SelectStockObject 与CDC::SelectObject
  10. C++学习 类定义(一)