采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
比如我想做一个计算器,把计算过程放在goroutine里,因为goroutine是乱序执行的我应该如何区分某个计算结果应该是哪次请求的呢? 举个例子,比如有两个用户a和b,a先请求但是计算非常复杂,b后请求但是计算简单,用goroutine的时候b的计算先算出了结果,channel先返回了b的结果,那我怎么知道这个返回的结果是a还是b的结果呢
这有很多种做法,简单的来说,channel和goroutine在go语言中,都不是“贵”的东西,我们可以为两个计算分别开一个channel,各自收各自的结果。不过这样有可能最终显示结果的时候也不是太容易,还是需要把channel映射到计算请求上去。
如果用一个channel的话,就要把计算请求加个id,把它们区分出来。比如:
type calcTask struct { id int result int}ch := make(chan calcTask)
type calcTask struct {
id int
result int
}
ch := make(chan calcTask)
我们在main里面维护一个id到计算任务的映射,就可以把结果映射到相应的计算任务上。
老师,关于goroutine在web服务中的使用场景有几个疑惑的问题: 前提是web服务以80端口启动。 1. 并发的多个请求对于服务来说是隔离开多个请求,比如一个计算器程序,同时发起多个计算的请求,对于服务来说都可以正确的返回每个请求对应的结果,不会有交叉的情况。所以对于这种简单的请求完全可以不用goroutine。 2.对于下游不依赖其返回值的代码,可以放到goroutine中执行,提高程序运行效率。比如计算器程序,如果想把用户的入参记录到日志,那可以把记录日志的代码放到goroutine中执行,计算的代码不用等待日志记录完毕。 不知道理解的是否正确。
是的。理解是正确的。不过1里面只是我们不用特地写goroutine,http服务器还是会在一个goroutine里面运行我们的handler的。
谢谢老师解惑
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
691 1
2.0k 1
1.1k 12