Go: 基于 Goroutine 实现 MySQL 并发写入

1
2
3
4
5
package main

func main() {
    routineTest()
}
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
func routineTest() {
    maxConnNum := 100
    ct := make(chan int, maxConnNum)

    for i:=0; i<maxConnNum; i++ {
        go run(ct)
    }

    for i:=0; i<10000; i++ {
        ct <- i
    }

    for i:=0; i<maxConnNum; i++ {
        ct <- -1
    }
}

func run (c chan int) {
    fmt.Println("Start a goroutine")
    for ;; {
        i := <-c
        if i == -1 {
            return
        }
        fmt.Println("Start query: #" + strconv.Itoa(i))
        _, err := models.GetAppService().CreateApp("test app", "test domain")
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("Query finished")
    }
}

当使用goroutine时,向 MySQL 写入 1000 条数据大约需要 4.8 秒左右,每个写操作花费 4.8 毫秒
当不使用 goroutine 时, 向 MySQL 写入 1000 条数据大约需要 255 秒左右, 每个写操作花费 255 毫秒