我最近开始学习Go语言,但是遇到了问题。我有一个简单的go例程,该例程可以将值返回或将值推入通道。我的主要fn代表一直在执行此例程,直到满足条件或数据用尽为止。这段代码似乎在“找到”频道上陷入僵局。我究竟做错了什么?
。
func workerRoutine(data Data, found chan bool, wg *sync.WaitGroup){
defer (*wg).Done()
// data processing
// return on false
// multiple routines can set this at the same time
found <-true
}
func main {
// ....
found:=make(chan bool)
var wg sync.WaitGroup
itemFound:=false
Loop:
for i:=0; i<limit; i++ {
select {
case <-found:
itemFound = true
break Loop
default:
if(some_check) {
wg.Add(1)
go workerRoutine(mdata,found,&wg)
}
}
}
wg.Wait()
// use itemFound
}
一种可能的解决方案是避免使用select语句,并为接收者(或发送者,或两者)使用单独的goroutine。例:
package main
import "sync"
func worker(res chan bool, wg *sync.WaitGroup) {
res <- true
wg.Done()
}
func receiver(res chan bool, wg *sync.WaitGroup) {
for range res {
}
wg.Done()
}
func main() {
var wg, wg2 sync.WaitGroup
wg.Add(1)
wg2.Add(10)
found := make(chan bool)
go receiver(found, &wg)
for i := 0; i < 10; i++ {
go worker(found, &wg2)
}
wg2.Wait()
close(found)
wg.Done()
}
问题内容: 我正在学习Go,并且正在通过GoTours 学习此课程。到目前为止,这就是我所拥有的。 如您所见,我尝试通过打印输出到通道中的值来测试Walk函数。但是,出现以下错误。 我认为应该会出现此错误,因为我从不使用该通道。但是,有没有一种方法可以“捕获”此死锁错误并以编程方式对其进行处理? 问题答案: 死锁类似于nil指针引用,它表示程序中的一个BUG。因此,此类错误通常无法恢复。 如lbo
我有一个Camel路由,在Karaf中运行,为此我添加了一个死信通道。这是为了处理路由失败的情况,我想保留问题消息并记录原因。我不能将异常抛回调用应用程序,因为我正在异步处理一些处理。 通过阅读文档和尝试大量案例,我不清楚如何将异常记录到Karaf的日志中,并将原始消息存放到死信队列中。 以下是我的摘录:- 如果我删除“onExcgon”结构,那么在所有异常情况下,源消息都会出现在死信队列中,但不
问题内容: 我正在使用goroutines /频道。这是我的代码。为什么超时情况没有得到执行? 问题答案: 您的超时不会发生,因为您的goroutine 之一会每1.5秒(或大约1.5秒)重复发送一次值在您的频道上,并且只有在2秒钟内没有接收到任何值时才会发生超时。 一旦从接收到一个值,在下一次迭代中将再次执行一个 新的 调用,该调用将返回一个 新的 通道,在该通道上将仅在另外2秒钟后发送一个值。
我遇到了围棋频道的奇怪行为。问题描述如下。 当我运行上面的代码时,我得到如下结果: 频道ch的len和cap看起来很复杂,但代码仍然有效。当我运行此代码时: 结果是:len:0 cap:0是nil:false致命错误:所有goroutine都处于Hibernate状态-死锁! 更重要的是,当我更改第二个代码块时,如下所示:package main 事情又起了作用,我得到了: 那么,谁能告诉我以下问
我不熟悉Reactor框架,并尝试在现有的实现中使用它。LocationProfileService和InventoryService都返回一个Mono,并并行执行,彼此之间没有依赖关系(来自MainService)。在LocationProfileService中-发出了4个查询,最后2个查询依赖于第一个查询。 有什么更好的方法来写这个?我看到调用按顺序执行,而其中一些应该并行执行。正确的做法是