当我们去数据库取数据时,如果按照顺序执行,将耗费很多等待数据库查询的时间,在go中常用携程和管道实现并发操作。
下面有两个示例,模拟使用orm在数据库取数花费时间:
package main
import (
"fmt"
"time"
)
func main() {
Task()
TaskWithGoroutine()
}
func Task() {
startTime := time.Now().UnixNano()
// 第一个任务: 数据库取数据
time.Sleep(2 * time.Second)
// 第二个任务
time.Sleep(2 * time.Second)
endTime := time.Now().UnixNano() // 结束计时
Millisecond := float64((endTime - startTime) / 1e6)
fmt.Printf("Task() finished in %f ms\n", Millisecond)
}
func TaskWithGoroutine() {
startTimes := time.Now().UnixNano()
ch1 := make(chan int) // 无缓冲
ch2 := make(chan int, 1) // 有缓冲
// 第一任务花费两秒
go func() {
defer fmt.Println("task1 done")
time.Sleep(2 * time.Second)
ch1 <- 11
}()
// 第二任务花费两秒
go func() {
defer fmt.Println("task2 done")
time.Sleep(2 * time.Second)
ch2 <- 11
}()
// 读取管道
<-ch1
<-ch2
endTimes := time.Now().UnixNano() // 结束计时
Milliseconds := float64((endTimes - startTimes) / 1e6)
fmt.Printf("TaskWithGoroutine() finished in %f ms\n", Milliseconds)
}
运行结果: