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。然後我們將結果從resultChan中取出。Golang:生產者/消費者併發模型但系列化結果
問題1:
在我的代碼,沒有序列化/ linearilized結果。儘管工作按照job1,job2,job3的順序進行。結果可能會以job3,job1,job2的形式出現,具體取決於哪一個最長。
我仍然想要同時執行這些工作,但是,我需要確保結果以相同的順序出現在結果中,並作爲工作進行。
問題2:
我有大約30萬就業崗位,這意味着該代碼將產生高達300K夠程。這是有效的,有這麼多的goroutines,或者我會更好地在一起分組工作在一個100分左右,並讓每個goroutine通過100而不是1.
這可能是重複的,請檢查以下鏈接:https://stackoverflow.com/questions/20744619/concurrent-producer-and-consumer-in-go/20745582#20745582 – ymg
嗨Yasir,謝謝你。但是,我不認爲這是重複的。因爲你指出的問題似乎沒有解決線性化/序列化的結果。 – samol