GO 的goroutine(协程)和thread(线程)有什么区别

本文探讨了Go语言中的goroutine(协程)与传统线程(Thread)的区别。goroutine相比线程更加轻量级,可以在同一台机器上支持数百万个并发执行。线程是多程序切换执行,而goroutine则不需要切换,执行完一个再执行另一个,除非遇到堵塞如等待IO或读取channel。文章通过代码示例展示了协程的主动切换和被动堵塞两种情况。

Thread 线程

在传统的web编程中,经常要用到多线程。比如 java,来一个websocket 即开启一个thread(线程)。

而thread的数目是有限的,一般的电脑可以同时开的thread数量大概几千个。而GO语言可以开启的goroutine,却可以达到几百万个,因此很显然goroutine不等于thread。

那么Thread和Goroutine的区别是什么?

Thread,即多个程序切换执行
示例代码:

线程1
thread1(){
for i = 1:10
print("Thread1 : ",i)
}
线程2
thread1(){
for i = 1:10
print("Thread2 : ",i)
}

执行结果是:

thread1 : 1
thread2 : 1
thread1 : 2
thread2 : 2
thread1 : 3
thread2 : 3
thread1 : 4
thread2 : 4
thread1 : 5
thread2 : 5

可以看到两个thread交替执行,最后产生同时执行的效果

Goroutine 协程

而协程则完全不是这么一回事,协程是不切换的,执行完协程A,再执行协程B
协程切换的条件有两个

  1. 该协程主动要求切换给其他协程
  2. 该协程执行时遇到堵塞,比如在等待 IO 读数据,或者读channel时陷入等待,这样就会被CPU强行切换到其他协程

代码测试

Go 语言的协程Goroutine Java 的线程Thread)在很多方面有所不同。 首先,Goroutine 在调度执行上更加高效。Go 语言的调度器可以在多个线程上运行数千个协程,并且自动处理调度资源管理。与之相比,Java 线程的调度由 JVM 进行管理,创建销毁线程的成本相对较高。 其次,Goroutine 的内存消耗较小。Goroutine 的栈大小通常只有几 KB,而 Java 线程默认的栈大小为几百 KB。这使得 Goroutine 创建销毁的成本更低,可以更好地支持大规模并发。 此外,Goroutine 的通信机制更加简单高效。Go 语言提供了轻量级的通道(Channel)用于协程之间的通信同步。而在 Java 中,线程之间的通信需要使用底层的锁、条件变量等机制,编写复杂且容易出错。 然而,Java 的线程也有它的优势。Java 线程可以使用更多的底层系统资源,例如底层操作系统线程多核 CPU 的并行计算。这使得 Java 线程适用于更加复杂底层的系统级开发。而 Goroutine 主要用于高性能、高并发的轻量级并发编程。 最后,Goroutine 对于错误处理防止资源泄漏有更好的支持。Go 语言的错误处理机制更加简洁明确,并且协程的生命周期通常与错误处理机制紧密结合。在 Java 中,需要显式地进行异常处理,否则可能会导致资源无法释放或程序崩溃。 总之,Go 语言的协程 Java 的线程在调度、执行效率、资源消耗、通信机制等方面存在差异。选择使用哪种并发机制取决于具体的应用场景需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值