今天在群里看到有人问怎么取并发获取数据库的数据
- 有群友说了用数据库的
union
是最好的办法 - 但是提问的群友坚持使用
goroutine
去获取 - 我也尝试写了一下, 期间还写了一些小
bug
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package main import ( "github.com/gin-gonic/gin" "net/http" "sync" "time" ) func main() { g := gin.Default() g.GET("/users", Users) g.Run(":8888") } func Users(c *gin.Context) { usersCh := make(chan []string, 0) wg := sync.WaitGroup{} for i := 0; i < 10; i ++ { go query(usersCh, &wg) } go func() { wg.Wait() close(usersCh) }() users := make([]string, 0) for items := range usersCh { users = append(users, items...) } c.JSON(http.StatusOK, users) } // 这里的 wg 一开始不是传的指针, 导致程序崩溃 func query(usersCh chan []string, wg *sync.WaitGroup) { wg.Add(1) // 这里模拟数据库耗时操作 time.Sleep(time.Second * 3) usersCh <- []string{ "david", "seth", } wg.Done() } |