【发布时间】:2015-01-29 22:57:06
【问题描述】:
也许我只是没有正确阅读规范,或者我的思维方式仍然停留在旧的同步方法上,但是在 Go 中发送一种类型作为接收其他类型作为响应的正确方法是什么?
我想出的一种方法是
package main
import "fmt"
type request struct {
out chan string
argument int
}
var input = make(chan *request)
var cache = map[int]string{}
func processor() {
for {
select {
case in := <- input:
if result, exists := cache[in.argument]; exists {
in.out <- result
}
result := fmt.Sprintf("%d", in.argument)
cache[in.argument] = result
in.out <- result
}
}
}
func main() {
go processor()
responseCh := make(chan string)
input <- &request{
responseCh,
1,
}
result := <- responseCh
fmt.Println(result)
}
对于这个例子来说,缓存并不是真正需要的,否则会导致数据争用。
这是我应该做的吗?
【问题讨论】:
-
增加一个全局输出通道会有什么问题,让你有一个
input和一个output?也许通过使input成为processor的参数并让processor返回输出通道来进行清理? -
@Volker 在这种情况下,我选择了可读性而不是 正确性,但是“返回输出通道”是什么意思?
-
遗憾的是,如果没有大量上下文,很难说出最佳安排是什么——例如,是否会有多个并发请求,响应顺序是否重要,是否会有一个处理器或一个池或几个不可互换的不同处理器,回调是否是此用例的更好接口等。但是至少传递带有请求的回复通道是一种合理的方法。
-
@twotwotwo 上下文是我有一个聊天服务器需要获取用户对象,我将其缓存在地图中,而不是每次都从数据库中获取。有了频道的想法,我想也许有一些
user := <- userFetchingChannel <- id -
文章pipelines and cancellation可能有帮助