【发布时间】:2021-08-21 08:50:30
【问题描述】:
在其他语言中,我可以同时运行多个任务并在相应的变量中获取每个任务的结果。
例如在 JS 中:
getApi1()
.then( res => console.debug("Result 1: ", res) )
getApi2()
.then( res => console.debug("Result 2: ", res) )
getApi3()
.then( res => console.debug("Result 3: ", res) )
而且我确切地知道哪个函数的执行结果在哪个变量中。
在 Python asyncio 中也是如此:
task1 = asyncio.create_task(getApi1)
task2 = asyncio.create_task(getApi2)
result1 = await task1
result2 = await task2
我是 Go 语言的新手。所有指南都说要使用带有 goroutine 的通道。
但我不明白,当我从频道阅读时,如何确定哪个消息匹配哪个结果?
resultsChan := make(chan map)
go getApi1(resultsChan)
go getApi2(resultsChan)
go getApi3(resultsChan)
for {
result, ok := <- resultsChan
if ok == false {
break
} else {
// HERE
fmt.Println(result) // How to understand which message the result of what API request?
}
}
【问题讨论】:
-
make(chan map)不会编译。请发布 MWE。要回答您的问题,如果您关心结果的来源,您应该使用适当的渠道元素类型(例如type Result struct { api string })。 -
@jub0bs,无论如何,如何将结果与我的 API 调用相匹配?
-
goroutines 不返回 results: 它们一直运行直到返回,但它们的返回类型始终是“什么都不返回”。所以 get 没有结果。
-
这能回答你的问题吗? Catching return values from goroutines
-
resultsChan的元素类型是什么?如果它是一个结构,你能不能简单地添加一个字段来指示结果来自哪里?
标签: go