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 にプッシュされ、ゴルーチンがそれを jobChan から取り出して同時にジョブを実行し、結果を resultsChan にプッシュします。次に、resultsChan から結果を引き出します。
質問1:
私のコードでは、シリアル化/線形化された結果はありません。ジョブは、ジョブ 1、ジョブ 2、ジョブ 3 の順に進みますが。結果は、最も時間がかかるジョブに応じて、ジョブ 3、ジョブ 1、ジョブ 2 のようになります。
ジョブを同時に実行したいのですが、結果がジョブとして入ったのと同じ順序で resultsChan から出てくることを確認する必要があります。
質問2:
約 30 万のジョブがあります。これは、コードが最大 30 万のゴルーチンを生成することを意味します。非常に多くのゴルーチンを使用することは効率的ですか、それともジョブを 100 程度のスライスにグループ化し、各ゴルーチンを 1 ではなく 100 を通過させる方がよいでしょうか。