请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

一个关于goroutine的问题

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

正在回答

1回答

ccmouse 2020-06-10 22:01:13

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

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

type calcTask struct {

     id int

     result int

}

ch := make(chan calcTask)

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

0 回复 有任何疑惑可以回复我~
  • 提问者 霜见 #1
    老师,关于goroutine在web服务中的使用场景有几个疑惑的问题:
    前提是web服务以80端口启动。
    1. 并发的多个请求对于服务来说是隔离开多个请求,比如一个计算器程序,同时发起多个计算的请求,对于服务来说都可以正确的返回每个请求对应的结果,不会有交叉的情况。所以对于这种简单的请求完全可以不用goroutine。
    2.对于下游不依赖其返回值的代码,可以放到goroutine中执行,提高程序运行效率。比如计算器程序,如果想把用户的入参记录到日志,那可以把记录日志的代码放到goroutine中执行,计算的代码不用等待日志记录完毕。
    不知道理解的是否正确。
    回复 有任何疑惑可以回复我~ 2020-06-10 22:47:51
  • ccmouse 回复 提问者 霜见 #2
    是的。理解是正确的。不过1里面只是我们不用特地写goroutine,http服务器还是会在一个goroutine里面运行我们的handler的。
    回复 有任何疑惑可以回复我~ 2020-06-10 23:23:48
  • 提问者 霜见 回复 ccmouse #3
    谢谢老师解惑
    回复 有任何疑惑可以回复我~ 2020-06-10 23:27:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信