学习笔记,写到哪是哪。
关于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会将计数器减一,一旦没了,就等待结束。
小结还有不少内容,细细看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)