在实际工作开发中我们需要根据工作负载是CPU密集型还是I/O密集型,使用不同的方式来解决问题。下面我们先来看这些概念,然后再讨论其影响。
在程序执行时,工作负载的执行时间会受以下因素限制:
- CPU的速度--例如,运行归并排序算法。工作负载被称为CPU密集型。
- I/O速度--例如,进行REST调用或数据库查询。工作负载被称为I/O密集型。
- 可用内存量--工作负载被称为内存密集型。
注意
鉴于近几十万年来内存价格变得越来越便宜,所以最后一种类型是当今最稀少的工作负载类型。
为什么在并发应用程序的上下文中对工作负载进行分类很重要?让我们通过一种并发模式来理解这一点:worker池。
下面这个例子实现了一个读函数,它接收一个io.Reader参数并从中重复读取1024字节,它会把读取到的字节数传给一个task函数,这个task函数会执行一些任务。task函数会返回一个整数结果,而我们最终会返回所有整数结果之和。下面是一个串行的实现:
func read(r io.Reader) (int, error) {count := 0for {b := make([]byte, 1024)_, err := r.Read(b)if err != nil {if err =&