func main() {
jobs := []Job{job1, job2, job3}
numOfJobs := len(jobs)
resultsChan := make(chan *Result, numOfJobs)
jobChan := make(chan *job, numOfJobs)
go consume(numOfJobs, jobChan, resultsChan)
for i := 0; i < numOfJobs; i++ {
jobChan <- jobs[i]
}
close(jobChan)
for i := 0; i < numOfJobs; i++ {
<-resultsChan
}
close(resultsChan)
}
func (b *Blockchain) consume(num int, jobChan chan *Job, resultsChan chan *Result) {
for i := 0; i < num; i++ {
go func() {
job := <-jobChan
resultsChan <- doJob(job)
}()
}
}
在上面的示例中,作业被推送到 jobChan 中,goroutines 会将其从 jobChan 中拉出并同时执行作业并将结果推送到 resultsChan 中。然后我们将从 resultsChan 中提取结果。
问题一:
在我的代码中,没有序列化/线性化的结果。尽管作业按作业 1、作业 2、作业 3 的顺序排列。结果可能会显示为 job3、job1、job2,具体取决于哪一个耗时最长。
我仍然想同时执行这些作业,但是,我需要确保结果从 resultsChan 中出来的顺序与它作为作业进入的顺序相同。
问题2:
我有大约 30 万个工作,这意味着代码将生成多达 30 万个 goroutine。拥有这么多 goroutine 是否有效,或者我最好将这些工作组合成 100 个左右的切片,让每个 goroutine 经历 100 个而不是 1 个。