go并发获取数据
go语言可以很轻松的实现并发获取数据,就算是新手也可以按部就班的套用现成的并发模式来实现并发。以下是一个简单的测试程序,其中有串行,并行。
package main
import (
"sync"
"time"
"fmt"
)
func main() {
syncFunc()
fmt.Println(">>>>>>>>>>>>>>>")
asyncFunc()
fmt.Println(">>>>>>>>>>>>>>>")
asyncChanFunc()
}
// 串行执行
func syncFunc() {
var n,m,x int
start := time.Now()
fmt.Println("syncFunc start:",start)
func () {
time.Sleep(time.Second*1)
n = 1
}()
func () {
time.Sleep(time.Second*2)
m = 2
}()
func () {
time.Sleep(time.Second*3)
x =3
}()
t := time.Now()
fmt.Println(t)
elapsed := t.Sub(start)
fmt.Println("syncFunc end:", elapsed, n, m, x)
}
// 并行执行
func asyncFunc() {
var n,m,x int
var wg sync.WaitGroup
wg.Add(3)
start := time.Now()
fmt.Println("asyncFunc start:", start)
go func () {
defer wg.Done()
time.Sleep(time.Second*1)
n = 1
}()
go func () {
defer wg.Done()
time.Sleep(time.Second*2)
m = 2
}()
go func () {
defer wg.Done()
time.Sleep(time.Second*3)
x = 3
}()
wg.Wait()
t := time.Now()
fmt.Println(t)
elapsed := t.Sub(start)
fmt.Println("asyncFunc end:", elapsed, n, m, x)
}
// 并行执行
func asyncChanFunc() {
var n, m, x =make(chan int),make(chan int),make(chan int)
start := time.Now()
fmt.Println("asyncChanFunc start:",start)
go func () {
time.Sleep(time.Second*1)
n <- 1
}()
go func () {
time.Sleep(time.Second*2)
m <- 2
}()
go func () {
time.Sleep(time.Second*3)
x <- 3
}()
fmt.Printf("n:%d, m:%d, x:%d\n",<-n, <-m, <-x)
t := time.Now()
fmt.Println(t)
elapsed := t.Sub(start)
fmt.Println("asyncChanFunc end:", elapsed)
}
测试结果: