[go学习笔记]二十、go语言协程机制

120 阅读1分钟

更多学习笔记和示例代码请访问:github.com/wenjianzhan…

Thread vs. Groutine

  1. 创建时默认的 stack 的大小
  • JDK5 以后 Java Thread stack 默认为1M
  • Groutine 的 Stack 初始化大小为2k
  1. 和 KSE (Kernel Space Entity)的对应关系
  • Java Thread 是 1:1
  • Groutine 是 M:N

Groutine 的使用

func TestGroutine(t *testing.T) {
	for i := 0; i < 10; i++ {
		go func() {
			fmt.Println(i)
		}()
	}
	time.Sleep(time.Millisecond * 50)
}

输出

=== RUN   TestGroutine
7
10
10
10
10
10
10
10
10
10
--- PASS: TestGroutine (0.05s)
PASS

Process finished with exit code 0

以上输出并不是我们理想的结果,那是因为 i 在多协程中,被共享了; 我们修改一下

func TestGroutine(t *testing.T) {
	for i := 0; i < 10; i++ {
		go func(i int) {
			fmt.Println(i)
		}(i)
	}
	time.Sleep(time.Millisecond * 50)
}

输出

=== RUN   TestGroutine
6
1
3
0
2
4
5
8
9
7
--- PASS: TestGroutine (0.05s)
PASS

Process finished with exit code 0

这次输出了我们想要的结果,那是因为 go 的方法传递的时候都是值传递,所以在这里是被复制了一份,每一个协程里边的地址是不一样的,所以结果是不一样的;

更多学习笔记和示例代码请访问:github.com/wenjianzhan…