Hello ~ Mr.多线程,听说你很快?

灵魂拷问:多线程一定快吗?

有些编程基础的朋友们都知道,我们使用多线程的目的就是为了加快程序的处理速度,但是我想重新思考一下用了多线程程序就一定快吗?实则不然,任何技术都有它的适用条件,只有在合适的场景运用合适的技术才能让程序拥有最佳的性能。那么我们就来探索一下多线程的适用条件有哪些。

条件1:把串行执行顺序可变为并行执行

以爬虫为例,下图为单线程爬虫的执行顺序,看箭头的指向,它们首尾衔接依次执行。
串行流程图
若改为多线程的爬虫程序,则变成了这种风格:
并行执行图
从上述流程图中可以看出红色箭头每到一个分叉点就直接产生了分支,多个分支共同执行。原来只有一个人干活,现在有多个人一起干活。这种方式速度当然大幅度提升。

但并不是所有的串行操作都可以转化为并行操作。再看看这个流程图,并不是一开始就是并行执行的,而是得到所有的图集链接后才开启了多线程。因为从打开首页到得到所有图集链接它们每一步都是环环相扣的,前一步的输出是后一步的输入。这种情况下就无法将串行变为并行。也就是说使用多线程的前提条件是:每个线程所执行的程序相互独立。如果我们所写的程序有严格的执行顺序,那么即使采用了多线程也于事无补。

条件2:线程创建与切换的开销小于程序运行的开销

天下没有免费的午餐,既然吃了多线程这碗饭,就得付出一点饭钱,这里的饭钱就是线程创建与线程上下文切换所需要的时间。创建线程需要一系列的步骤,这都是耗时操作。
线程的上下文切换是指线程调度过程中额外的消耗,线程调度的算法有很多,这里以时间片轮转算法为例简单解释。
现代操作系统即使是单核CPU也可以同时运行多个程序,这就得益于操作系统的时间片轮转调度算法。操作系统会给每个程序分配时间片,在某段时间内只运行这一个程序,当该程序的时间片结束时CPU运行别的程序。程序切换时需要保存一些相关的信息,以便下一次继续运行该程序。由于时间片的时间非常短,使用者根本察觉不到,所以我们才感觉是多个程序同时运行。

既然使用多线程需要付“饭钱”,那么我们就要考虑到这“饭钱”的性价比了。假设一个任务运行完成需要1秒,创建线程的时间为2秒(实际上创建线程的非常短),那我们直接单线程运行就好了,盲目使用多线程只会适得其反。杀鸡焉用宰牛刀!

条件3: 计算资源充足

俗话说巧妇难为无米之炊,多线程速度快的原因之一就是它可以充分利用计算的计算资源,比如CPU、内存、网络带宽等。假设我们需要开发一个下载工具,计算机带宽总共5Mb/s,某个资源下载速度为1Mb/s,那么我们开10个线程,下载速度也提升不到10Mb/s。

若不考虑计算资源的限制盲目使用多线程可能会造成频繁的上下文切换,CPU使用率达到100%,从而程序卡慢。这就相当于一个房门平时只能同时进5个人,现在一下子10个都抢着进去必然混乱。倒不如把多线程改为单线程,让这10个人依次进门,这样会比多线程无限制地抢占资源要好很多。

总结

只有充分考虑到了多线程的应用场景,我们才能更好地运用多线程,发挥出多线程这把宝刀的强大功力,披荆斩棘乘风破浪,不然会误伤自己痛心不已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值