liuguang
189 天前
go 语言协程的主要用途是哪里,是 web 开发。
web 后端最常见的任务就是等 io ,比起计算任务 io 操作是非常耗时间,而线程遇到 io 操作会卡住,完全不能做任何事,而协程这时候就可以挂起 io 去处理其它事情,所以看上去协程的效率更高。不过实际上协程本质上也是线程,甚至是多个线程合力都有可能,这句话不假,你可以把协程看成一种精心设计好的线程,但是它能在遇到 io 阻塞时,继续去做其它事情。
但是协程就一定比普通线程更快吗,其实并不是的,rust 的异步里面也说了异步操作不一定更快,所以 rust 语言不仅有异步语法,也有原生线程,从而可以看情况来选择。与此相比 go 语言只提供了协程来处理并发,在需要原生线程的地方就会效率更慢。
你可能会问,到底什么时候协程会比线程慢,那就是非 io 密集型的任务,比如说只需要进行密集计算的任务。这种以计算为主要任务的程序,io 操作很少,io 操作当然就不会是线程的瓶颈了。起几个原生的线程去并发运算,自然比起几个协程的效率高,协程总是需要 CPU 去调度切换的,然而这种操作却是毫无价值。