【发布时间】:2024-01-21 14:12:01
【问题描述】:
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:
在我的代码中,没有序列化/线性化的结果。尽管作业按作业 1、作业 2、作业 3 的顺序排列。结果可能会显示为 job3、job1、job2,具体取决于哪个耗时最长。
我仍然希望同时执行这些作业,但是,我需要确保结果从 resultsChan 中出来的顺序与它作为作业进入的顺序相同。
问题2:
我有大约 30 万个作业,这意味着代码将生成多达 30 万个 goroutine。拥有这么多 goroutine 是否有效,或者我最好将这些工作组合成 100 个左右的切片,让每个 goroutine 经历 100 个而不是 1 个。
【问题讨论】:
-
这可能是重复的,请查看此链接:*.com/questions/20744619/…
-
嘿亚西尔,谢谢你。但是,我不认为这是重复的。因为您指出的问题似乎并未解决线性化/序列化结果。
标签: concurrency go goroutine