golang 併發demo 寫入 redis

2022-06-28 01:06:14 字數 1831 閱讀 8415

源**:

package main

import (

"fmt""

runtime""

strconv""

time""

gopkg.in/redis.v3")

var(

jobnum =runtime.numcpu()

//每次寫入redis的數量

//除以 jobnum 為了保證改變了任務數, 總量不變, 便於測試

procnum = 100000 /jobnum

)type job

struct

func waitjobs(dones

<-chan struct{}, results chan string

)

default

:

ifdone }}

}func initclient(poolsize

int) *redis.client )

if err := client.flushdb().err(); err !=nil

return

client

}func main() ()

//任務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) {}

"job id:", id, "完成")

}()

//寫入 procnum 條資料

for idx := 0; idx < procnum; idx++

"key:", key, " | result:", val, " | error:", err)

}

return"ok

", nil

}//1 新增 job 到 channel

go func()

}defer close(jobs)

}()//2 並行執行 jobs

for j :=range jobs (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

okok

okok

okok

okok

end:

2019-09-24

08:26:35.655656884 +0000 utc m=+1.043292369

jobs num:

8 total items: 100000

total seconds:

1.04149031

8 個 goroutine: 1s 完成10w資料寫入

Golang 讀取寫入Etcd

新一代etcd etcd3 etcd是乙個高可用的 key value 儲存系統,主要用於分享配置和服務發現。簡單 支援 curl 方式的使用者 api http json 安全 可選 ssl 客戶端證書認證 快速 單例項可達每秒 1000 次寫操作 可靠 使用 raft 實現分布式 例如 版本 解...

golang 閒談併發

對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...

golang 併發實踐

golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...