并发效率一定高吗

  • 当只有一个CPU时,程序基本都是计算类的操作,用多线程是无法提升效率的,带来更多的是多线程的切换的问题。但是如果程序有大量的BIO操作,是可以在这样的系统中使用多线程的,因为在I/O等待的过程中,CPU是空闲的,其他的线程依然可以使用CPU来处理问题。
  • 当程序是十分简单的运算时(例如在一个大数组中求最大值,最小值,平均值),多线程的效果并不明显甚至不如单线程,因为创建线程本身就需要花时间,而这个时间可以计算许多的数字,因为计算数字对于CPU来讲完全是小儿科。
  • 当用多线程从一个公用硬盘I/O中读取大量的数据时,希望已此方式来提升I/O读取的性能,基本上很难(除非是SSD硬盘可以考虑),因为硬盘I/O本身就是硬件中最慢的设备,并行的效果只会导致更多的争用。在I/O层面我们可以根据某些隔离条件使用多线程去处理,但隔离的粒度一定是基于一些场景下的测试数据,例如从远程数据库读取数据,到底开多少个连接并行拖数据不会影响在线业务,而且拖数据的性能是最佳的。

  有的小伙伴从I/O获取到数据后,通常还要做许多其他的动作,在在个过程中希望另一个线程来读取I/O中的数据,难道用多线程不对吗?

  此时需要考虑下,做其他的操作需要多长时间,如果在100ms中使用90ms或者更多的时间做I/O,剩余的时间做其他的事情,那么另一个线程等待了很久终于获取到锁了,该线程还没获取完数据,前一个做完事情的线程又回来请求数据,争用会无休止地进行下去,其实就是为了10ms,如果配置了5个,10个线程,争用将会更加恐怖。

  当然若果发现做完I/O读操作后,处理数据的时间占比较大,这个时间浪费了不值得,那么可以尝试用生产者/消费者模式来平衡,让一个线程去读,读完后放入一个队列中(放入队列的时间相对于I/O的时间来讲几乎可以忽略),所以这个线程几乎一直在做I/O读操作,这样在低级的磁盘上很多时候还可以实现顺序读/写操作有效地利用了磁盘的带宽,当生产者读取数据太慢,消费者等等也无所谓,不会形成争用。当生产者读取数据太快时,可以尝试增加消费者的线程,或者在达到某个高水位线时,需要让生产者等待一下(利用阻塞队列可以实现)

  有的小伙伴可能会说,可以将文件分解为多个片段,多个线程分开读取每个片段,不过这需要磁盘的IOPS能力足够强才行,要知道普通的机械磁盘是串行的。另外,需要考虑这个文件是否足够大,需要我们去分段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值