草庐IT

channel剪枝

全部标签

在 go 中使用 channel 返回值测试发射器函数

我很难对我的发射器函数进行测试,该函数通过数据管道的channel传递结果。此功能将定期触发并从数据库中提取记录。我为这个问题编译了一个精简的完成版本,真正的代码会更复杂,但会遵循相同的模式。为了进行测试,我模拟了对数据库的访问,因为我想测试Emitter函数的行为。我想代码不仅仅是文字:这是我要测试的方法://EmittRecordpullrecordfromdatabasefuncEmittRecord(svcService,countint)我有几个带有接口(interface)的类型://RecordisaRecordfromdbtypeRecordstruct{Field1s

与卡夫卡消费者一起去 channel

我刚开始学习channel。我正在使用汇合的kafka消费者来创建功能性消费者。我想要完成的是将消息发送到缓冲channel(2,000)...然后使用管道将channel中的消息写入redis。我已经通过执行println来让消费者部分工作了一条一条地发送消息,直到它到达偏移量的末尾,但是当我尝试添加一个channel时,它似乎命中了default:switch中的案例然后就卡住了。我似乎也没有正确填写channel?这fmt.Println("countis:",len(redisChnl))总是打印0这是我目前所拥有的://Examplefunction-basedhigh-le

go - 连续向多个 channel 发送数据

我有以下场景:一个函数每分钟调用一次,每次调用它时都会尝试将数据发送到多个定义的channel。varchan1=make(chanbool)varchan2=make(chanbool)varchan3=make(chanbool)gofunc(){for{然后在三个独立的go例程中,每个channel都通过select读取,就像这样。gofunc(){varmyVarboolselect{case问题是只有chan1从第一个基于时间的循环接收数据。因此,似乎正在发生的是,在读取第一个channel之前,所有后续channel的数据发送都被阻止。我该如何纠正这个问题?

go - 如何使用 channel 通知 goroutine 正确退出

注意:我用谷歌搜索了这个主题,并阅读了我能找到的几乎所有内容,但仍然无法获得正确/合理/生产就绪的答案。基本上所有答案都差不多,就像这个:howtostopagroutine,都采用相同的模式,无一异常(exception):真正的工作是fmt.Println(1)打印一些东西,或者只是//Dootherstuff,但如果将实际工作保留在forselectdefaultcasebranch,然后它将被执行多次,用于打印一些东西它很好,但显然它还没有为实际工作做好准备。我能想到的唯一有效方法是将真正的工作放在一个案例分支上,然后向该案例发送仅一个信号以通知它开始,就像这里:playgro

multithreading - 在 Go 中关闭自馈 channel

我正在尝试使用Go中的并发和channel。我面临的问题主要是并发的想法,所以我不认为以下逻辑是错误的或者应该改变。我有一个缓冲区大小为“N”的缓冲channel,它还代表将要创建的goroutine的数量。所有例程都从一个channel读取并写入另一个channel,主goroutine将打印来自最终channel的值。1个输入channel---N个goroutines查找并添加到输入和输出---1个输出channel问题是我总是遇到死锁,因为我不知道如何关闭一个正在self馈送的channel,也不知道它什么时候会停止,所以我也无法关闭输出channel。代码如下:package

go - GoLang 中使用 channel 的优先级队列

Question上图中是我需要提供解决方案的问题。这是我想出的解决方案(必须用Go编码)。我收到死锁错误:fatalerror:allgoroutinesareasleep-deadlock!goroutine1[chansend]:main.main()/home/kypriank/Assignment5/priorityqueue.go:42+0x1a3goroutine17[chansend]:main.priorityQueue(0xc420080060,0xc4200800c0)/home/kypriank/Assignment5/priorityqueue.go:22+0x

go - channel 在不同的 goroutine 中消费顺序

packagemainimport("fmt""time")funcmain(){done:=make(chanbool)gofunc(){for{select{case我的问题是donechannel是否由goroutine而不是主goroutine使用。该程序将被阻止。但事实是程序永远不会被阻塞。maingoroutine似乎每次都消耗donechannel。为什么? 最佳答案 尽管我没有在文档中找到答案,但看起来接收值是首先尝试从channel读取的例程。在我们的例子中,总是main方法几乎总是达到(99.0%),因为例程异步

go - 如何等到缓冲 channel (信号量)为空?

我有一片整数,它们是并发操作的:ints:=[]int{1,2,3,4,5,6,7,8,9,10}我使用缓冲channel作为信号量,以便获得并发运行的go例程的上限:sem:=make(chanstruct{},2)for_,i:=rangeints{//acquiresemaphoresem上面的代码在达到最后一个或最后两个整数之前运行良好,因为程序在最后一个go例程完成之前结束。问题:如何等待缓冲channel耗尽? 最佳答案 您不能以这种方式使用信号量(在本例中为channel)。当您处理值和分派(dispatch)更多go

go - 在管道中将 channel 作为参数传递时出现死锁

我正在编写一个练习,将数字分成100组并同时计算阶乘,但是我的代码让我陷入僵局。我认为问题可能出在管道链启动上。由于所有函数都将channel作为参数,我不清楚为什么main中的gofunc没有传递给定的in。channel值genConcurrentGroup当此行total:=时起作用发生了。packagemainimport"fmt"funcmain(){in:=make(chanint)out:=make(chanfloat64)gofunc(){in0{//certain100groupsfori:=1;i 最佳答案 1。

go - 无论我是否关闭 channel , map 缩小都不起作用

这是家庭作业和初学者问题。我编辑了这个问题,因为我发现了一个错误。我正在尝试从文本中进行并行频率映射,但在最后一个操作(减少映射)中出现错误到目前为止,代码似乎可以正常工作。如果我关闭channel,我会收到错误消息:“panic:在关闭的channel上发送”如果我不关闭channel,我会得到:“fatalerror:所有goroutines都睡着了-死锁!”funcWordCount(textstring){text=strings.ToLower(text)re:=regexp.MustCompile("\\w+")sentence:=re.FindAllString(text