CPU密集表示该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就只有这么多。
CPU使拆胡用率较高(例如雹裤:计算圆周率、对视频进行高清解码、矩阵运算等情况)的情况下,通常,线程数只需要设置为CPU核心数的线程个数就可以了。 这一情况多出现在一些业务复杂的计算和逻辑处理过程中。比如说,现在的一些机器学习和深度学习的模型训练和推理任务,包含了大量的矩阵运算。
IO密集型:指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等IO (硬盘/内存) 的读写 *** 作,因此源御简,CPU负载并不高。
密集型的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O *** 作,而程序的逻辑做得不是很好,没有充分利用处理器能力。
CPU 使用率较低,程序中会存在大量的 I/O *** 作占用时间,导致线程空余时间很多,通常就需要开CPU核心数数倍的线程
举个去饭店吃饭的例子,假设饭店里只有一个服务员,这个服务员每次只能服务一桌顾客,那么后来的顾客就只能等前面的顾客结束用餐后才能进行就餐,这样导致好多顾客等不及就去了别家。老板为了挽回这种局面,就额外聘请了其他几个服务员。这样一来,每次羡漏饭店就能同时服务之前好几倍的客人了。老板看到客流量大大增加,虽然需要另外付出几个服务员的工资,但是相较于总体收入来说,提升的收益远大于付出。这个例子里的服务员其实就相当于一个线程,提供读写、计算能力。在单线程模式下,任务都是串行执行的,前一个任务执行完才能执行下一个任务,简答的说,这种方式的效率很低下,最简单的解决办法就是,找一种方法可以同时执行多个任务,这就是多线程的来源。
既然多线程可以提高任务执行的效率,那么是不是线程数越多,效率提升的越明显呢?同样采用饭店的例子来说,前期可能多请几个服务员会使饭店的收益明显提升,但是想通过继续招聘服务员的方式来持续扩大营业额就会有点不切实际。思考一下:即使招聘了足够多的服务员,每个顾客过来都能有自己的专属服务员,是不是就能提高饭店的产出效率呢?当然不是,即使每个服务员收到了顾客的下单后立即反馈到后厨,后厨的厨师也不一定能马上做好相应的饭菜,做完每一份饭菜也是需要一定时间的。那这种情况下想要提高产出效率就只能再招聘更多的厨师了。这里的厨师其实对应饭店本身的处理能力,也就是我们常说的硬件资源。单纯的通过招聘服务员(提升线程数),受到饭店本身处理能力的限制,其实是不会再对效率有显著的提升。相反,招聘更多的服务员反而会消耗更多的工资。
线程的本质都是在处理一些事情。这些事情按特点可划分为io密集型和CPU密集型。简言之,io密集型程序主要用于io的读写,比如文件的读写;而cpu密集型程序主要用作计算,比如循环、递归等计算处理过程。那么这两种类型的程序应该如何设闷庆置线程数才能使效率最大化呢?下面分开叙述:
io密集型程序的主要耗时在相关io的 *** 作上,以阻塞性io为例(这里不展开讲io的类型),io的耗时主要在于数据的准备等待及写入。这个时间相较于cpu的处理时间通常是要更多的。我们设置最优线程数的目的就是希望能够同时处理多个事情,避免相互之间的等待,最好是io处理的线程和cpu处理的线程同时结束就完美了。基于这个考虑,我们可以归纳出一个数学模型:假设io处理的时间为to,cpu处理的时间为tu,io线程数为1,那么基于io和cpu同时处理完蚂派握成的考虑,cpu的线程数即为to/tu,另外由于cpu可能有多个核心,所以最终合适的线程总数为(1+to/tu)*cpu核心数
cpu密集型程序主要考虑cpu的计算时间,多个核心的线程可并行执行,所以合适的线程数应该为cpu核心数,考虑到线程阻塞等异常情况的影响,可以设定为cpu核心数+1
线程数量不是越多越好,总会有一个较优的值区间,而且这个线程数的设定也不能一概而论,要针对具体的线程类型来考虑,本文基于io密集型和cpu密集型线程分别给出估算最优线程数的思考过程,记录也是为了更好的思考。
爬虫io密集网速卡。根据查询相关信息得知网络爬虫程序是一种山辩IO密集型(页面请求,文件读取)程序,会阻塞程序的运行伍乎消耗大量时间,而Python提供多种并发编程方式,能够在一定程度上提升IO密集型程序腔唯悉的执行效率。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)