NOTE

2.14 goroutine

1. goroutine是什么 - 程序、进程、线程.md - Go语言实现的用户线程 - 相比较于线程,goroutine - 创建、销毁和切换:都在用户态完成无需进入内核 - 内存占用:默认栈大小为2K,并且可以动态扩缩容 2. goroutine使用 2.1. 创建协程 - go f(x, y

Go创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. goroutine是什么

  • 程序、进程、线程.md(关联笔记尚未公开)
  • Go语言实现的用户线程
  • 相比较于线程,goroutine
    • 创建、销毁和切换:都在用户态完成无需进入内核
    • 内存占用:默认栈大小为2K,并且可以动态扩缩容

2. goroutine使用

2.1. 创建协程

func TestGoroutine1(t *testing.T) {
	go func(x, y, z int) {
		time.Sleep(time.Second * 1)
		fmt.Println(x + y + z)
	}(1, 2, 3)
	time.Sleep(time.Minute * 5)

}
  • go f(x, y, z)会启动一个新的goroutine运行函数f(x, y, z)
    • 函数f,变量x、y、z的值是在原goroutine计算的,只有函数f的执行是在新的goroutine中的
    • 新的goroutine会创建一个新栈

2.2. 协程池

协程池.md

3. goroutine原理

func TestGoroutine1(t *testing.T) {
	go func(x, y, z int) {
		time.Sleep(time.Second * 1)
		fmt.Println(x + y + z)
	}(1, 2, 3)
	time.Sleep(time.Minute * 5)

}
  • go tool compile -S goroutine函数调用go f(1, 2, 3)
0x0024 00036 (goroutine1_test.go:10)	PCDATA	$0, $0
0x0024 00036 (goroutine1_test.go:10)	 PCDATA	$1, $0
0x0024 00036 (goroutine1_test.go:10)	MOVL	$24, (SP)
0x002b 00043 (goroutine1_test.go:10)	PCDATA	$0, $1
0x002b 00043 (goroutine1_test.go:10)	LEAQ	"".TestGoroutine1.func1·f(SB), AX
0x0032 00050 (goroutine1_test.go:10)	PCDATA	$0, $0
0x0032 00050 (goroutine1_test.go:10)	MOVQ	AX, 8(SP)
0x0037 00055 (goroutine1_test.go:10)	MOVQ	$1, 16(SP)
0x0040 00064 (goroutine1_test.go:10)	MOVQ	$2, 24(SP)
0x0049 00073 (goroutine1_test.go:10)	MOVQ	$3, 32(SP)
0x0052 00082 (goroutine1_test.go:10)	CALL	runtime.newproc(SB)

可以看出调用的是CALL runtime.newproc(SB) 也就是说go f(args)相当于runtime.newproc(size, f, args)

4. goroutine调度

GMP.md

5. 参考