首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下:

单线程,多线程,多进程测试代码使用死循环。

1)单线程:

2)多线程:

3)多进程:

查看cpu使用效率:

开始观察分别执行时候cpu的使用效率:

1)单线程执行的时候:

2)多线程执行的时候:

3)多进程执行的时候:

总结:

1)单进程单线程时,对于双核CPU的利用率只能利用一个核,没有充分利用两个核。

2)单进程多线程时,对于双核CPU的来说,虽然两个核都用到的,不过很明显没有充分利用两个核,这里要说一个GIL(全局解释器锁)的概念:

GIL不同于线程之间的互斥锁,GIL并不是Python的特性,而是Cpython引入的一个概念。(Jpython,PYPY)

Python的代码由Python的解释器执行(CPython)。那么我们的代码什么时候被python解释器执行,由我们的GIL也就是全局解释器锁进行控制。

当我们有一个线程开始访问解释器的时候,GIL会将这把锁上锁,也就是说,其他线程无法再访问解释器,也就意味着,其他的线程无法再被执行。

GIL执行流程:

  1. 加锁GIL。

  2. 切换到一个线程去执行。

  3. 运行。

  4. 解锁GIL。

再次重复以上步骤。

对于下列代码GIL的执行流程:

import threading
import time
# 写两个函数,分别让两个线程去执行
# 这个两个函数,都要访问我的全局变量
number = 0def test1(count):global numberfor i in range(count):number += 1print(number)def test2(count):global numberfor i in range(count):number += 1print(number)def main():th1 = threading.Thread(target=test1,args= (1000000,))th2 = threading.Thread(target=test2, args=(1000000,))th1.start()th2.start()time.sleep(5)print(number)if __name__ == '__main__':main()

运行结果(这里充分的说明了多线程资源抢占问题):

流程图如下:

线程1在执行到对全局变量加一操作的时候全局解释器锁被收回,线程2申请并得到了全局解释器锁开始运行,在线程2执行完加一操作以后对全局变量进行了修改并释放了全局解释器锁。

这时线程1再次得到了全局解释器锁,从上次释放全局解释器锁的地方开始继续执行对全局变量加一的操作,记住,这里线程1中的全局变量还是开始的0,虽然线程2已经对其进行了加一的操作,但是线程1并不知道,线程1还是会接着上一次的位置开始执行,所以线程1在执行完加一操作的时候同样把1再次赋值给了全局变量num,也就是说,线程2执行完加一操作之后赋值过去的1又被线程1赋值过去的1所覆盖,加了两次等于加了一次!类似于协程,只是做了一个执行代码来回切换的操作!

所以在Python中,同一时刻,只能有一个线程被执行。所以Python中的多线程是假的。

既然这样我们为什么还要用多线程呢?

其实多线程也有它的好处,例如我们在进行IO操作的时候,有效的组织了程序的阻塞,不至于一直无限的等待。

3)多进程时,对于双核CPU来说,每个进程的优先级都是同等的,所分配的资源也是相等的,两个进程的时候完全可以充分的利用双核CPU,而且由于计算密集型的任务完全是依靠于cpu的核数,所以需要尽量的完全利用cpu,这时候多进程的好处就能够完美的体现出来。

转载于:https://www.cnblogs.com/wf-skylark/p/9030690.html

在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析相关推荐

  1. python threading-单线程 多线程 主线程 子线程 setDeamon join

    python threading-单线程 多线程 主线程 子线程 setDeamon join 单线程 多线程 主线程和子线程 setDaemon() join() 测试多线程下程序运行的时间 创建多 ...

  2. Python中单线程、多线程与多进程的效率对比实验

    Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以发挥多 ...

  3. python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例

    python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束. Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread ...

  4. python 中单线程 与多线程 与多进程的性能分析

    cpython 解释器执行代码 python 代码的执行有 python 虚拟机进行控制的, python解释器可以运行多个线程,但在任意给定时刻只有一个线程会被解释器执行 对于Python虚拟机的访 ...

  5. python中单线程重复利用

    使用队列重复利用单线程 # 重复利用的线程. 线程一般跑完就结束了. # 即创建一个线程, 给一个任务, 执行完后在等待接受下一个任务并执行, 以达到重复利用的目的. ""&quo ...

  6. python中单线程异步非阻塞

    socket操作中产生阻塞的地方有:连接的时候,就是执行connect函数的时候,还有就是接受数据的时候产生阻塞,就是执行recv函数等待服务端返回数据的时候 非阻塞就是不等待的意思,执行setblo ...

  7. python内嵌函数和闭包与java 匿名内部类_Java匿名内部类构造原理分析

    很明显,我们的匿名内部类有了名字 InnerTest$1,而且是继承自 Test class InnerTest$1 extends Test 这个类中有一个成员final InnerTest thi ...

  8. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  9. 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...

    最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程!",但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先 ...

最新文章

  1. stm32外部中断_STM32学习笔记 | 电源管理及低功耗设计要点
  2. 同一解决方案内的多个项目之间如何引用?
  3. golang实现的布隆过滤器_面试官:都 2020 年,你在干嘛?还不知道布隆过滤器
  4. linux上如何查看具体的命令属于哪个安装包
  5. 基准风险因子暴露度_具有性能基准SQL Server索引填充因子
  6. android 选择银行类型,『自定义View实战』—— 银行种类选择器
  7. 翻译:swift 5通过使用泛型进行高级异步操作Operation
  8. SpringBoot启动后启动内嵌浏览器
  9. SqlServer2012下载+安装+启动(资源+密钥)
  10. 微信小程序 循环展示
  11. 光谱分辨率单位_【ENVI入门系列】16.基本光谱分析
  12. Nature综述:宏基因组时代的病毒分类
  13. JDBC execute常用方法
  14. 2003英语单词四6级大学六级CET6资料
  15. [分享]高手是怎样炼成的:精妙SQL语句介绍
  16. balsamiq原型工具
  17. 贝壳找房户外拓展(中等) 扫描线
  18. TensorBoard对训练过程可视化(不用tf.summaries.merge_all)
  19. C语言数字图像处理---1.2 彩色图像灰度化和二值化
  20. 【编程不良人】SpringSecurity实战学习笔记07---授权

热门文章

  1. Nagios监控HP硬件状态
  2. jfinal启动正常,但是报错:oejw.WebAppContext:Failed startup
  3. Jquery Div居中
  4. Linux sh/bash[精华]
  5. windows下安装php5.5的redis扩展
  6. iOS10推送适配完整说明
  7. 吴颖二:12.27 什么是现货,如何操作才能盈利
  8. (转)【重磅】无监督学习生成式对抗网络突破,OpenAI 5大项目落地
  9. 细说HTTP中POST与GET的区别与联系
  10. IDF 实验室 初探乾坤