关于golang:Go语言快速入门笔记二并发编程部分

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)
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理