如何找出一个的goroutine做,不堵塞?
-
20-09-2019 - |
题
我见过的所有实施例迄今涉及阻断得到结果(经由<-chan
操作符)。
我的当前方法包括将指针传递到一个结构:
type goresult struct {
result resultType;
finished bool;
}
其中够程完成时写入。然后,它检查finished
只要方便简单的事情。你有更好的方法?
我真正的目标是向Qt信号槽系统。我有一种预感,该解决方案将看起来几乎微不足道(chan
s有大量未开发的潜力的),但我还没有足够熟悉的语言来弄明白。
解决方案
您可以使用“逗号,OK”的格局(见“有效去他们的网页“):
foo := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
其他提示
SELECT语句允许您一次检查多个渠道,采取随机分支(其中通信正在等待的那些)的:
func main () {
for {
select {
case w := <- workchan:
go do_work(w)
case <- signalchan:
return
// default works here if no communication is available
default:
// do idle work
}
}
}
对于所有的发送和接收 在“选择”语句表达, 信道表达式进行求值, 伴随着出现的任何表情 在发送的右侧 表情,由上到下的顺序。 如果任何导致操作都可以 继续进行,一个被选择和 相应的通信和 报表进行评估。除此以外, 如果有一个默认的情况下, 执行;如果没有,语句块 直到通信中的一个可以 完整。
您还可以偷看通道缓冲器以查看它是否包含任何通过使用LEN:
if len(channel) > 0 {
// has data to receive
}
这不会接触到通道缓冲器,不同于foo, gotValue := <- ch
其去除的值时gotValue == true
。
不隶属于 StackOverflow