golang多协程并发工作示例
golang多协程并发工作
package main import ( "fmt" "log" "os" "sync" "time" ) type Task struct { Name string Age int } func work(wg *sync.WaitGroup, jobs chan Task, w int, logger *log.Logger) { defer wg.Done() for true { job, ok := <-jobs if !ok { break } logger.Printf("[%d]name=%s age=%d\n", w, job.Name, job.Age) } } func main() { start := time.Now() file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { panic(err) } defer file.Close() gLogger := log.New(file, "", log.Ldate|log.Ltime|log.Lshortfile) gLogger.Println("[main] ready go") wg := &sync.WaitGroup{} jobs := make(chan Task) workers := 10 for w := 0; w < workers; w++ { wg.Add(1) go work(wg, jobs, w, gLogger) } for i := 0; i < 10000; i++ { task := Task{ Name: fmt.Sprintf("Name-%d", i), Age: i, } jobs <- task } close(jobs) wg.Wait() gLogger.Printf("[main] done, cost: %s", time.Now().Sub(start)) }
作者:Standby — 一生热爱名山大川、草原沙漠,还有我们小郭老师!
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。