golang 并发demo 写入 redis
生活随笔
收集整理的這篇文章主要介紹了
golang 并发demo 写入 redis
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接:golang 并發demo 寫入 redis
源代碼:
package mainimport ("fmt""runtime""strconv""time""gopkg.in/redis.v3" )var (jobnum = runtime.NumCPU()//每次寫入redis的數量//除以 jobnum 為了保證改變了任務數, 總量不變, 便于測試procnum = 100000 / jobnum )type Job struct {ID stringClient *redis.ClientResult chan<- string }func waitJobs(dones <-chan struct{}, results chan string) {working := jobnumdone := falsefor {select {case result := <-results:println(result)case <-dones:working--if working <= 0 {done = true}default:if done {return}}} }func initClient(poolSize int) *redis.Client {client := redis.NewClient(&redis.Options{Addr: "localhost:6379",DialTimeout: time.Second,ReadTimeout: time.Second,WriteTimeout: time.Second,PoolSize: poolSize,Password: "123.com",DB: 0,})if err := client.FlushDb().Err(); err != nil {panic(err)}return client }func main() {start := time.Now()fmt.Println("start:", start)defer func() {end := time.Now()fmt.Println("end:", end)fmt.Println("jobs num:", jobnum, "total items:", jobnum*procnum)fmt.Println("total seconds:", end.Sub(start).Seconds())}()//任務channel 定義緩沖器為job數量jobs := make(chan Job, jobnum)//存放結果results := make(chan string, jobnum*procnum)//每個任務完成之后給dones發送一次dones := make(chan struct{}, jobnum)client := initClient(10)defer client.Close()//定義每個任務執行的方法jobfunc := func(client *redis.Client, id string) (string, error) {defer func() {//完成之后向 dones 發送數據dones <- struct{}{}//fmt.Println("job id:", id, "完成") }()//寫入 procnum 條數據for idx := 0; idx < procnum; idx++ {key := id + "-" + strconv.Itoa(idx)_, err := client.Set(key, time.Now().String(), 0).Result()if err != nil {return "", err}//fmt.Println("key:", key, " | result:", val, " | error:", err) }return "ok", nil}//1 添加 job 到 channel go func() {for index := 0; index < jobnum; index++ {jobs <- Job{strconv.Itoa(index), client, results}}defer close(jobs)}()//2 并行執行 jobsfor j := range jobs {go func(job Job) {jobfunc(client, job.ID)job.Result <- "ok"}(j)}//3 等待所有任務完成 waitJobs(dones, results) }運行結果:
[root@localhost 111]# go run redis.go start: 2019-09-24 08:26:34.614166323 +0000 UTC m=+0.001802059 ok ok ok ok ok ok ok ok end: 2019-09-24 08:26:35.655656884 +0000 UTC m=+1.043292369 jobs num: 8 total items: 100000 total seconds: 1.041490318 個 goroutine: 1s 完成10w數據寫入
轉載于:https://www.cnblogs.com/wangjq19920210/p/11579059.html
總結
以上是生活随笔為你收集整理的golang 并发demo 写入 redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go Channel 详解
- 下一篇: golang []byte 和 stri