共计 1316 个字符,预计需要花费 4 分钟才能阅读完成。
1. 协程是轻量级的线程的了解
(1)java 里的 Thread 默认为 1M,Groutine 的 Stack 初始化为 2K(2)一个 thread 对应一个 kernel space,groutine 则是多对多
2. 第一个简略的多线程案列
for i := 0; i < 10; i++ {go func(i int) {println(i)
}(i)
}
}
3. 如何做到多线程累加同一数据的安全性
func TestGroutine1(t *testing.T) {
count := 0
mutex := sync.Mutex{}
for i := 0; i < 10; i++ {go func() {defer func() {mutex.Unlock()
}()
mutex.Lock()
count++
println(count)
}()}
}
4. 如何打印完 10 个数主线程再输入 Done?
func TestGroutine1(t *testing.T) {
count := 0
mutex := sync.Mutex{}
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {wg.Add(1)
go func() {defer func() {mutex.Unlock()
}()
mutex.Lock()
count++
println(count)
wg.Done()}()}
wg.Wait()
println("done")
}
5.CSP 并发机制
联合一个前端开发的场景,应用 ajax 异步去数据
会阻塞在取数据的 channel 上
func AsyncAJAX() chan string {channel := make(chan string)
data := "Hello world"
go func() {time.Sleep(time.Second * 10)
println("ajax 执行结束")
channel <- data
}()
return channel
}
func TestCSP(t *testing.T) {println("Ajax 发送申请")
c := AsyncAJAX()
println("渲染")
println("取数据",<-c)
}
6.select 多路抉择做超时管制
func TestCSP(t *testing.T) {println("Ajax 发送申请")
c := AsyncAJAX()
select {
case ret := <-c:
t.Log(ret)
case <- time.After(time.Second * 5):
t.Log("time out")
}
}
7.close 掉 channel 会迅速接到 0 值
8. 带 buffer 的话就能够沉积
func dataSend(c chan int) {go func() {
for i := 0;;i++ {time.Sleep(time.Second * 1)
println("发送第", i)
c <- i
}}()}
func dataRecv(c chan int) {go func() {
for {time.Sleep(time.Second * 5)
println("接管第", <- c)
}}()}
func TestMore(t *testing.T) {c := make(chan int, 5)
dataSend(c)
dataRecv(c)
time.Sleep(time.Second * 100)
}
正文完