golang 协程池并发插入数据

来源:这里教程网 时间:2026-03-01 16:50:19 作者:

package main import ( "database/sql" "fmt" "math/rand" "strings" "sync" "time" _ "github.com/go-sql-driver/mysql" ) type Tag struct { ID   int    `json:"id"` Name string `json:"name"` } type Job struct { id   int name string } type Result struct { job         Job sumofdigits int } var jobs = make(chan Job, 10) var results = make(chan Result, 10) func initData(name string) int { db, err := sql.Open("mysql", "root:linuxer@tcp(127.0.0.1:3306)/study") if err != nil { panic(err.Error()) } defer func() { db.Close() }() strSql := strings.Join([]string{"INSERT INTO t(name) VALUES('", name, "')"}, "") fmt.Println(strSql) _, err = db.Query(strSql) // handle error if err != nil { panic(err) } fmt.Print("Successfully  Inserted\n") return 0 } func worker(wg *sync.WaitGroup) { for job := range jobs { output := Result{job, initData(job.name)} results <- output } wg.Done() } func createWorkerPool(noOfWorkers int) { var wg sync.WaitGroup for i := 0; i < noOfWorkers; i++ { wg.Add(1) go worker(&wg) } wg.Wait() close(results) } func allocate(noOfJobs int) { for i := 0; i < noOfJobs; i++ { name := RandStringBytes(5) job := Job{i, name} jobs <- job } close(jobs) } func result(done chan bool) { for result := range results { fmt.Printf("Job id %d, input random no %d , sum of digits %d\n", result.job.id, result.job.name, result.sumofdigits) } done <- true } const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" func RandStringBytes(n int) string { b := make([]byte, n) for i := range b { b[i] = letterBytes[rand.Intn(len(letterBytes))] } return string(b) } func main() { startTime := time.Now() noOfJobs := 20 go allocate(noOfJobs) done := make(chan bool) go result(done) noOfWorkers := 3 createWorkerPool(noOfWorkers) <-done endTime := time.Now() diff := endTime.Sub(startTime) fmt.Println("total time taken ", diff.Seconds(), "seconds") }

相关推荐