我對Go非常陌生,正在尋找一種方法來處理使用100個工作人員的3000個查詢,並確保每個工作人員的連接(MySQL已經配置了超過100個連接)。這是我的嘗試:處理查詢的工作池
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var query *sql.Stmt
func worker(jobs <-chan int, results chan<- int) {
for _ = range jobs {
_, e := query.Exec("a")
if e != nil {
panic(e.Error())
}
results <- 1
}
}
func main() {
workers := 100
db, e := sql.Open("mysql", "foo:[email protected]/foo")
if e != nil {
panic(e.Error())
}
db.SetMaxOpenConns(workers)
db.SetMaxIdleConns(workers)
defer db.Close()
query, e = db.Prepare("INSERT INTO foo (foo) values(?)")
if e != nil {
panic(e.Error())
}
total := 30000
jobs := make(chan int, total)
results := make(chan int, total)
for w := 0; w < workers; w++ {
go worker(jobs, results)
}
for j := 0; j < total; j++ {
jobs <- j
}
close(jobs)
for r := 0; r < total; r++ {
<-results
}
}
它的工作,但我不知道如果是這樣做的最佳方式。
請,如果您認爲這是基於意見或根本不是一個好問題,請將其標記爲關閉並留下評論以解釋原因。
[Rob Pike的「併發性不是並行性」](http://vimeo.com/49718712)從第19分鐘開始 - 「一個非常簡單的負載平衡器」,它可以在一些工作人員之間分配工作。 – thwd 2014-10-30 16:37:43
@tomwilde,當然,我正在閱讀http://talks.golang.org/2012/waza.slide#40謝謝! – coma 2014-10-30 16:45:02
@tomwilde,在這個例子中,Rob並沒有緩衝頻道,但是如果我不使用任務總數來緩衝頻道,那麼我只能獲得工作完成後的工作人員數量。 – coma 2014-10-30 17:10:50