1 回答
TA贡献1827条经验 获得超8个赞
大约 2 个月前(或更多)语言开发人员谈到侵入线程计数控制(和一些其他限制)。所以我们可以期待很快看到它。一个月或更长时间前,我开发了这个问题,在我的 linux 机器上发现 GOMAXPROCS 没有超过 256 的值。如果我向它发送 300 或更多,结果总是 256。但我发现 goroutines 不是线程。Goroutines 可以存在于一个线程中。
至于惯用同步 - 我认为没有必要同步太多。在我的代码中,我通常使用 goroutine 仅通过通道进行通信的想法。通道应该作为 goroutine 的参数传递。
func main() {
ch1 := make(chan SomeType1)
ch2 := make(chan SomeType2)
go generator(ch1, ch2)
go processor(ch1, ch2)
// here main func becomes waiting until it capture 2 of ch2-finished-signals
<- ch2
<- ch2
// usually we don't need the exact values of ch2-signals,
// so we assign it to nothing
}
func generator(ch1 chan SomeType1, ch2 chan SomeType2) {
for (YOUR_CONDITION){
// generate something
//....
// send to channel
ch1 <- someValueOfType1
}
ch1 <- magicStopValue
ch2 <- weAreFinishedSignal1
}
func processor(ch1 chan SomeType1, ch2 chan SomeType2) {
// "read" value from ch1
value := <-ch1
for value != magicStopValue {
// make some processing
// ....
//get next value from ch1 and replay processing
value = <- ch1
}
// here we can send signal that goroutine2 is finished
ch2 <- weAreFinishedSignal2
}
如果 goroutines 在一个线程中,它们的通信速度会更快。对我来说,通道性能差得很远,但足以满足多种用途。
- 1 回答
- 0 关注
- 197 浏览
添加回答
举报