英文:
golang use channel with time out pattern to jump out of loop
问题
学习了来自《Go并发模式》中的超时模式后,我尝试检查一个通道并跳出for循环。
循环:
for {
// 在for循环中重复执行某些操作
// 检查exitMessage以确定是否跳出循环
select {
case <-exitMessage:
break Loop
case <-time.After(1 * time.Millisecond):
}
}
超时机制避免了select
在读取通道时被阻塞。问题是,在Windows XP机器上,这个延迟比1毫秒要长得多(参考时间延迟不准确的问题),这会显著减慢for循环的速度。
一个折中的解决方案是创建另一个goroutine(我知道它很廉价)来监听exitMessage
:
exitFlag := 0
// 另一个goroutine来检查exitMessage
go func(in chan int) {
exitFlag = <-in
}(exitMessage)
for exitFlag == 0 {
// 在for循环中重复执行某些操作
}
是否有更好的模式来中断Go中的for循环?
英文:
Learning from go time out pattern go concurrency patterns, I try to check a channel and to break out of a for loop
Loop:
for {
//do something repeatedly very fast in the for loop
//check exitMessage to see whether to break out or not
select {
case <- exitMessage:
break Loop
case <- time.After(1 * time.Millisecond):
}
}
The time-out avoids select
gets stuck reading from a channel. The problem is that on a Windows XP machine, that delay is much longer than 1 millisecond (per time delay inaccuracy problem) which slows down the for-loop significantly.
A hacked-up solution is to get another goroutine (I know it's cheap) to listen for the exitMessage
exitFlag := 0
//another goroutine to check exitMessage
go fun(in chan int){
exitFlag = <-in
}(exitMessage)
for exitFlag == 0 {
//do something repeatedly very fast in the for loop
}
Is there a better pattern to interrupt a for-loop in go?
答案1
得分: 12
使用带有默认子句的选择语句如何?如果通道无法接收,将执行默认子句。
循环:
for {
select {
// 检查 exitMessage 是否为真,以确定是否跳出循环
case <- exitMessage:
break Loop
// 在 for 循环中重复执行某些操作
default:
// 处理逻辑
}
}
英文:
How about using a select statement with a default clause which will execute if the channel can't receive?
Loop:
for {
select {
//check exitMessage to see whether to break out or not
case <- exitMessage:
break Loop
//do something repeatedly very fast in the for loop
default:
// stuff
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论