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:
В моем коде нет сериализованных / линеаризованных результатов. Хотя задания идут в порядке job1, job2, job3. Результаты могут быть такими: job3, job1, job2, в зависимости от того, какой из них занимает больше всего времени.
Я по-прежнему хотел бы выполнять задания одновременно, однако мне нужно убедиться, что результаты выводятся из resultsChan в том же порядке, в котором он входил в качестве заданий.
Вопрос2:
У меня примерно 300 тыс. Заданий, это означает, что код сгенерирует до 300 тыс. Горутин. Эффективно ли иметь так много горутин, или мне лучше сгруппировать задания в кусочки из 100 или около того, чтобы каждая горутина проходила через 100, а не через 1.