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)
}
发表回复