go协程是什么?
go协程(goroutine)是go实现并行处理的核心,协程是比进程更小的单位。go语言内部为其实现了内存共享,执行goroutine只需要极少的栈内存(大概4-5kb),并且goroutine是由用户在go中直接调度使用的。与进程线程相比,它不需要CPU直接进行资源分配和调度管理,从而极大地减少了CPU的任务量,减轻了CPU的负担。
优势:
- 占用内存小,更轻便。
- 提高了CPU利用率和并发率,更高效。
- 用户态就可以调度使用,更易用。
- 减轻了CPU的负担。
缺点:
虽然在go中创建一个协程花销很小很容易,但如果内存里积累了成千上万个协程的话,还是会对性能有影响。可能导致协程泄漏。协程泄漏是因为我们不停的去创建协程,以为协程都会正常退出,而实际上协程阻塞到一直无法退出。根据实践来看,大部分的协程泄漏都和管道的阻塞有关系,比如试图从空管道中读数据,试图从满的管道中写数据。
简单示例:
只需在函数调用语句前添加go关键字,就可创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。
package main
import (
"fmt"
"time"
)
func newTask() {
fmt.Println("this is a newTask")
}
func main() {
go newTask()//新建一个协程
fmt.Println("this is a main goroutine")
time.Sleep(time.Second)
}
运行结果:
可以发现,主协程先执行,主协程之外的协程在主协程的基础上并发执行,不过一旦主协程退出,其他协程也强制退出。所以本例在主协程中添加了一个time.Sleep,用于延迟主协程时间,从而使其他协程执行完成。