func Run(ui common.UI, taskType string) error { // if clusterConf != "" { // // TODO: add ClusterWorker // return nil, fmt.Errorf("TODO: Cluster support") // } wt, ok := g_workers_tasks[taskType] if !ok { return fmt.Errorf("unknown worker type: %s", taskType) } conf := ui.ConfigGet() bconf := conf.GetBasicConfig() workers := make([]Worker, bconf.Concurrency) for index, _ := range workers { w, err := wt(ui) if err != nil { return err } workers[index] = &LocalWorker{task: w} } ui.WorkStart(bconf.NumRequests) defer func() { for _, worker := range workers { worker.Halt() } }() var wg sync.WaitGroup var wgres sync.WaitGroup reqchan := make(chan int64, 1024*1024) // TODO: how big should this be? reschan := make(chan *common.Result) for _, worker := range workers { err := worker.Start(taskType, &wg, reqchan, reschan) if err != nil { return err } } var i int64 for i = 0; i < bconf.NumRequests; i++ { reqchan <- i // TOOD: ui.WorkStatus(numDone int64) } wgres.Add(1) rw := common.NewResultArchiveWriter() defer rw.Remove() go resultHanlder(ui, &wgres, reschan, rw) close(reqchan) wg.Wait() close(reschan) wgres.Wait() ui.WorkEnd() rw.Close() rr := common.NewResultArchiveReader(rw.Path) return reports.Run(ui, taskType, conf, rr) }