goroutine實現題整理

1、Golang使用2個goroutine分別打印奇偶數,順序輸出1-10

package main

import (
   "fmt"
   "sync"
   "time"
)

var wg sync.WaitGroup
func main() {
   ch := make(chan struct{})
   wg.Add(2)
   go printOdd(ch)
   go printEven(ch)
   wg.Wait()
}

func printOdd(ch chan struct{}) {
   defer wg.Done()
   for i:=1;i<=9;i+=2 {
      time.Sleep(time.Second)
      fmt.Println(i)
      ch <- struct{}{}
   }
}

func printEven(ch chan struct{}) {
   defer wg.Done()
   for i:=2;i<=10;i+=2  {
      <-ch
      time.Sleep(time.Second)
      fmt.Println(i)
   }
}

2、對goroutine實現每秒并發(fā)請求數限制

簡單的實現,實際應用中可以采用令牌桶限流

package main

import (
   "fmt"
   "time"
)

func main() {
   if err:=recover();err!=nil {
      fmt.Println(err)
   }

   tick1 := time.NewTicker(time.Second)
   ch := make(chan struct{},3)
   for {
      select {
      case <-tick1.C:
         for i:=0;i<=100000;i++ {
            ch<- struct{}{}
            go func() {
               if err:=recover();err!=nil {
                  fmt.Println(err)
               }
               fmt.Println("xxx")
               time.Sleep(time.Second)
               <-ch
            }()
         }
      }
   }
}

3、Go實現兩個goroutine交替打印切片并實現超時控制

func PrintArray(list []int, timeout float64) {
   ctx, cancel := context.WithTimeout(context.Background(), time.Second*time.Duration(timeout))
   defer cancel()

   allow := make(chan bool)
   finish := make(chan struct{})

   go func() {
      for i := 0; i < len(list); i++ {
         allow <- true
         time.Sleep(time.Second)
         if i%2 == 0 {
            fmt.Println("goroutine-1:", list[i])
         }
      }

      finish <- struct{}{}
   }()

   go func() {
      for i := 0; i < len(list); i++ {
         <-allow
         if i%2 == 1 {
            fmt.Println("goroutine-2:", list[i])
         }
      }

      finish <- struct{}{}
   }()

   finishCount := 0
   for {
      select {
      case <-ctx.Done():
         fmt.Println("timeout")
         return
      case <-finish:
         finishCount += 1
         if finishCount == 2 {
            return
         }
      }
   }
}

4、實現多個協(xié)程按順序打印數字

func main() {
   a := 0
   fn := func() int {
      a++
      return a
   }
   ch := make(chan int, 1)
   finish := make(chan int, 3)
   for i := 0; i < 3; i++ {
      go func(j int) {
         for {
            ch <- 1
            n := fn()
            if n > 100 {
               finish <- 1
               <-ch
               return
            }
            fmt.Println("go", j, n)
            <-ch
         }

      }(i)
   }

   for i := 0; i < 3; i++ {
      <-finish
   }
}

5、實現每秒打印一次,并且程序不會中斷

//題目:原題這樣
func main() {
     go func(){
           //在這里寫實現的代碼
     }()
     
     select{}
 }

func proc() {
    panic("this is a error")
}

//實現:實現這樣
func main() {
    go func() {
        ticker := time.NewTicker(time.Second)
        for {
            select {
            case <-ticker.C:
                go func() {
                    defer func() {
                        if err := recover(); err != nil {
                            fmt.Println(err)
                        }
                    }()
                    proc()
                }()
            }
        }
    }()
    select {}
}

func proc() {
    panic("this is a error")
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容