源**:
package mainimport (
"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...