cpython 解释器执行代码

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

    对于Python虚拟机的访问有全局解释器锁(GIL)控制的,这个锁就是用来保证同时只有一个线程被运行的
复制代码

GIL 锁的主要流程

    1. 设置GIL2. 切换到一个线程去执行3. 执行下面的操作a.执行python的非IO程序(cpu计算)b.执行IO相关(发生阻塞),线程让出控制权4.线程进入睡眠状态(切换出线程)5.解锁GIL6.重复1-5
复制代码

总结

python, 特指CPython的实现,由于GIL的存在,python 多线程不能有效的利用多核处理器。 表现为任意时间只有一个线程在跑,而IO密集型运算,多数是在IO读写将线程阻塞掉了, 这个时候线程切换是很合理的,反正线程只是单纯地等待,在这个等待的时候去做其他的事情, 资源利用率就上去了.对于多进程,因为每个进程都有独立的GIL,就可以利用多核的特性处理 CPU密集的操作

IO(Input/ Output)密集:多线程 (网络IO,磁盘IO)等

CPU密集:多进程 纯计算(分布式计算)

测试

  • 生成一个线程类继承 分别测试 单线程和多线程下的IO密集和CPU密集的时间

    import threading
    import timeclass MyThread(threading.Thread):def __init__(self,func,args, name):super(MyThread,self).__init__()self.func = funcself.args = argsself.name = namedef get_res(self):return self.resultdef run(self):self.result = self.func(*self.args)######################  def sum1(start, end):ans = 0for i in range(start,end+1)ans += ireturn ans# 执行写入操作
    def openIO(end):for i in range(0,end):fd = open('1','w')fd.write('s')fd.close()# 单线程cpu
    def singleThread(start,end):print("sing thread start")t_start = time.time()ans = 0for i in range(start,end+1):ans += it_stop = time.time()print("ans = %d" % ans)print("single thread done cost:%.2fd" % (t_stop - t_start))# 多线程 cpu
    def multiThread():print("mutli thread start")t_start = time.time()nums = [(1, 100000000), (100000001, 200000000), (200000001, 300000000)]threads = []for i in range(0,len(nums)):t = MyThread(sum1,nums[i], sum1.__name__)threads.append(t)for i in range(len(threads)):threads[i].join()ans += threads[i].get_res()t_end = time.time()print(ans)print("multi thread done cost:%.2f" % (t_end - t_start))# CPU 运算
    def CPUslove():singleThread(1,300000000)multiThread()def IOSingle():print("IO single start")t_start = time.time()openIO(55000)openIO(35000)t_end = time.time()print("io single done cost %.2f" % (t_end - t_start))def IOMulti():print("IO multi start")t_start = time.time()t1 = MyThread(openIO, (55000,),openIO.__name__)t2 = MyThread(openIO, (35000,),openIO.__name__)t1.start()t2.start()t1.join()t2.join()t_end = time.time()print("io multi done cost %.2f" % (t_end - t_start))    def IOSlove():IOMulti()IOSingle()def main():IOSlove()CPUSlove()if __name__ == '__main__':main()复制代码
  • 结果如下图所示:

python 中单线程 与多线程 与多进程的性能分析相关推荐

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

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...

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

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

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

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

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

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

  5. 以爬取知乎为例,进行python 多进程爬虫性能分析

    以爬取知乎为例,进行python 多进程爬虫性能分析 如果对多进程multiproessing模块不熟悉,请先浏览 python 使用multiprocessing模块进行多进程爬虫 问题背景: 爬取 ...

  6. Python学习笔记:多线程和多进程(转1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. python中线程里面多线程_Python中的线程和多线程是什么

    一.线程的概念 一个进程里面至少有一个控制线程,进程的概念只是一种抽象的概念,真正在CPU上面调度的是进程里面的线程,就好比真正在地铁这个进程里面工作的实际上是地铁里面的线程,北京地铁里面至少要有一个 ...

  8. python中的多任务-多线程和多进程

    多线程和多进程都是实现多任务的一种方式,但是对于很多初学者来说想分清楚他们往往是一件非常头疼的事,首先我们需要了解多任务的概念. 所谓的多任务就是在同一时刻同时做很多事情,比如我们一边使用浏览器上网一 ...

  9. python 上市公司 概念股_python多线程和多进程获取所有上市公司的实时数据

    前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 肯定有人想的是,用一个列表存储所有上市公司的股票代号,然后无限循环获取不就得了吗? ...

最新文章

  1. linux中创建本地yum库,轻松安装Linux软件
  2. JAVA中经过nginx反向代理获取客户端ip并获取相关坐标等信息
  3. 使用sqlmap直连数据库获取webshell
  4. Windows下Appium环境搭建(java版)
  5. 我心目中理想的开源软件
  6. Flask框架(flask中对cookie的处理(设置cookie、获取cookie、删除cookie))
  7. github删除错误的commit并保留之前的提交
  8. 四十六、Qt网络(六)UDP
  9. dijkstra算法和floyd算法(C语言)
  10. SpringBoot : Consider defining a bean of type xxx in your configuration.
  11. Java各版本特性简介
  12. sql server 2008 数据结构及数据内容一起导出的方法(导出脚本形式)
  13. HTML5与CSS3权威指南.pdf7
  14. 最大熵模型介绍及实现
  15. [luoguP2147] [SDOI2008]Cave 洞穴勘测(并查集 || lct)
  16. 华为手机自带的双系统模式,你知道吗?一部手机当两部使用
  17. Written English-书面-现在进行时
  18. 解决Docker下载镜像速度太慢
  19. 关闭微信这几个功能,不然真的会泄露微信隐私
  20. 2021年江苏高考成绩排名查询,2021年江苏高考一分一段表查询排名方法 成绩排名位次什么时候公布...

热门文章

  1. mysql基础之存储引擎
  2. BZOJ 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)
  3. WordPress Tweet Blender插件跨站脚本漏洞
  4. display:inline-block;在各浏览器下的问题和终极兼容办法
  5. 使用mencoder转换flv为ipad/iphone下能播放的mp4格式
  6. spring-boot-devtools热加载不起作用
  7. 简单的描述关于开发部署产生401,500的错误处理
  8. 1)Linux学习笔记:crontab命令
  9. ubuntu下,apt的参数使用,很实用呦
  10. jQuery UI 应用不同Theme的办法