一个关于goroutine的问题

来源:10-1 goroutine

霜见

2020-06-04

比如我想做一个计算器,把计算过程放在goroutine里,因为goroutine是乱序执行的我应该如何区分某个计算结果应该是哪次请求的呢?
举个例子,比如有两个用户a和b,a先请求但是计算非常复杂,b后请求但是计算简单,用goroutine的时候b的计算先算出了结果,channel先返回了b的结果,那我怎么知道这个返回的结果是a还是b的结果呢

写回答

1回答

ccmouse

2020-06-10

这有很多种做法,简单的来说,channel和goroutine在go语言中,都不是“贵”的东西,我们可以为两个计算分别开一个channel,各自收各自的结果。不过这样有可能最终显示结果的时候也不是太容易,还是需要把channel映射到计算请求上去。

如果用一个channel的话,就要把计算请求加个id,把它们区分出来。比如:

type calcTask struct {

     id int

     result int

}

ch := make(chan calcTask)

我们在main里面维护一个id到计算任务的映射,就可以把结果映射到相应的计算任务上。

0
6
ccmouse
回复
霜见
不依赖返回值:直接go func ...就行 依赖返回值:不开goroutine,直接函数调用。 依赖多个返回值:各开一个goroutine,让它们并发执行。如果子任务是数量确定的: a:=<-ch1 b:=<-ch2 ... 不确定的话,才是你说的用waitgroup
2020-08-02
共6条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程