packagemainimport("context""errors""fmt""runtime""sync")typeTaskFuncfunc(ctxcontext.Context)errorfuncExecuteAll(numCPUint,tasks...TaskFunc)error{varerrerrorctx,cancel:=context.WithCancel(context.Background())defercancel()wg:=sync.WaitGroup{}wg.Add(len(tasks))ifnumCPU==0{numCPU=runtime.NumCPU()}fmt.Println("numCPU:",numCPU)queue:=make(chanTaskFunc,numCPU)// Spawn the executerfori:=0;i<numCPU;i++{gofunc(){fortask:=rangequeue{fmt.Println("get task")iferr==nil{taskErr:=task(ctx)iftaskErr!=nil{err=taskErrcancel()}}wg.Done()}}()}// Add tasks to queuefor_,task:=rangetasks{queue<-task}close(queue)// wait for all task donewg.Wait()returnerr}funcmain(){tasks:=make([]TaskFunc,0,100)fori:=0;i<100;i++{func(valint){tasks=append(tasks,func(ctxcontext.Context)error{fmt.Println(val)ifval==51{returnerrors.New("missing")}returnnil})}(i)}err:=ExecuteAll(0,tasks...)iferr==nil{fmt.Println("missing error")}}
queue:=make(chanTaskFunc,numCPU)//
// 中間省略一堆代碼//
//// Add tasks to queuefor_,task:=rangetasks{queue<-task}close(queue)// wait for all task donewg.Wait()