学习笔记,写到哪是哪。
关于golang的协程早有耳闻,具体概念不过多赘述了,可以理解为轻量级的线程,一个线程中可以存在多个协程。协程在同一个线程中,只有一个协程在运行。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
1、go关键字使用
看看协程的使用。
样例代码如下:
package main import ( "fmt" "time" ) func printName() { for i := 0; i < 100; i++ { fmt.Println(i) time.Sleep(1 * time.Second) } } func printName1(a int) { for i := 0; i < 2; i++ { fmt.Printf("a=%d\n", a+i) time.Sleep(1 * time.Second) } } func main() { go printName() printName1(100) }
直接结果
a=100
0
1
a=101
可以看出,go函数在异步执行。
2、协程等待
golang的协程等到方式,sync.WaitGroup的使用类似于Java的CountDownLatch类的使用。
样例代码如下
package main import ( "fmt" "sync" "time" ) var ( wg sync.WaitGroup ) func wait_go() { defer wg.Done() _i := 0 for _i <= 2 { fmt.Println("haha") time.Sleep(1 * time.Second) _i++ } } func wait_go1() { defer wg.Done() _i := 0 for _i <= 3 { fmt.Println("ohoh") time.Sleep(1 * time.Second) _i++ } } func main() { fmt.Println("start") wg.Add(2) go wait_go() go wait_go1() wg.Wait() }
执行结果
start
ohoh
haha
haha
ohoh
ohoh
haha
ohoh
可以看出,主函数并没有直接结束,而是在wg.Wait()等待协程函数执行结束。wg.Add类似计数器,有几个需要等到的函数就添加多大的数字,函数在执行结束的时候wg.Done会将计数器减一,一旦没了,就等待结束。
小结
还有不少内容,细细看。