为什么Go的并发比Java更好?
在这个视频中,我将向您介绍Go和Java完全不同的并发模型和原理。首先,需要了解Go语言中的一个重要概念:Goroutine是Go语言中并发的基本单位,可以理解为Java中的线程,但比线程更轻量级、更好用。
每个正在运行或等待运行的Goroutine都有一个相关的G对象。M代表操作系统线程模式,它负责执行以上的Goroutine。在Go语言中,M是被管理和调度的,就像一个管理者兼打工人。它不是直接与操作系统交互的。
每个M都有一个相关的Goroutine队列,而P就是逻辑处理器,它也是调度器的一部分,负责在M上执行G。P的数量通常与CPU的核心数相对应,多个P可以在一个M上交替执行Goroutine。
介绍完这些组件,让我们来梳理一下GMP模型的工作流程。当您在Go程序中使用Go关键字创建一个Goroutine时,它就会被创建。调度器将其加入到一个空闲的P的Goroutine队列中。调度器选择一个空闲的P来运行队列中的Goroutine。
这个P会与一个M相关联,然后M会获得操作系统的调度资源,并分发给这个P,让其执行Goroutine。如果一个Goroutine在执行过程中发生了阻塞,例如等待I/O完成,那么M就会解除与P的绑定。
然后M可以执行其他P对应的Goroutine,以充分利用多核的CPU资源。一旦被阻塞的Goroutine可以继续执行,M就可以重新与P相关联,并重新执行Goroutine队列。
在这里,M和P的关系可以理解为M是一个资源调度器,而P是真正的执行者。M可以在不同的P之间进行切换,从而实现CPU的资源调度。可以看出,它的原理与Java完全不同。Go语言可以高效地利用多核CPU上的并发,执行多个Goroutine。因此,您认为Go在并发方面具有技术优越性吗?
本文暂时没有评论,来添加一个吧(●'◡'●)