草庐IT

select - 选择中的 Golang channel 未接收

我目前正在编写一个小脚本,我在其中使用channel、选择和goroutine,我真的不明白为什么它没有像我想的那样运行。我有2个channel供我所有的goroutines收听。我将channel传递给每个goroutine,其中有一个select,必须根据数据首先出现的位置在2个之间进行选择。问题是没有goroutine落入第二种情况。我可以一个接一个地收到100个工作,我在日志中看到了所有内容。它很好地完成了第一种情况下的要求,然后它在第二个channel中发送了工作(如果它做得很好......)我没有更多的日志。我只是不明白为什么...如果有人能启发我:)packagemain

asynchronous - 在golang中,如何编写一个为下一阶段引入延迟的流水线阶段?

我正在关注https://blog.golang.org/pipelines文章实现了几个阶段。我需要其中一个阶段在事件传递到管道的下一阶段之前引入几秒钟的延迟。我对下面的代码的担忧是,它会在传递事件之前产生无限数量的time.Sleep()例程。有没有更好的方法来做到这一点?谢谢!funcfooStage(inChan 最佳答案 您可以使用另一个channel来限制您的循环能够创建的事件goroutine的数量。constnumRoutines=10funcfooStage(inChan

go - 拉 0 大小的 golang chan

我的用例如下:我需要向0...N订阅者发送POST请求,这些订阅者由targetUrl表示。我想将goroutine的最大数量限制为100。我的代码(简化)如下:packagemainimport("fmt""log""net/http""errors")constMAX_CONCURRENT_NOTIFICATIONS=100typeSubscriptionstruct{TargetUrlstring}funcnotifySubscribers(subs[]Subscription){log.Println("notifySubscribers")varbuffer=make(cha

go - 在具有 select case 和 default 的 Goroutines 中,一旦 channel 关闭,default 不应该被执行

我试图了解带有默认大小写的选择block中关闭channel的行为,但对以下输出感到困惑。这里调用50个goroutines并关闭结束channel。functestClosedChannelBehavior(){constn=50finish:=make(chanbool)vardonesync.WaitGroupfori:=0;i我预计一旦任何goroutine打印“receivedfinish”,默认情况不应该被任何其他goroutine执行,即“我没有等待”不应该被打印。但是输出不一致。有时它的行为符合预期,但在多次运行时,我会看到如下所示的意外输出:=====输出======

goroutine 阻塞和非阻塞用法

我正在尝试了解go-routines的工作原理。这是一些代码://parallelSum.gofuncsum(a[]int,cchan以上程序运行良好并返回输出。我有同一个程序的迭代版本://iterSum.gofuncsumIter(a[]int,c*int,func_idstring){sum:=0log.Printf("enteredthefunc%s",func_id)for_,n:=rangea{sum+=n}log.Printf("func_id%visDONE!",func_id)*c=sum}funcmain(){*/ELEM_COUNT:=10000000test_a

for-loop - 为什么我需要对我的 go 例程/ channel 的结果进行额外的 for 循环以显示所有结果?

代码的快速解释:我正在搜索db.Feeds()这是一个RSS提要URL列表。我在getFeeds()中获取提要通过协程运行getFeeds()的输出返回到rsschannel然后我打印RSS信息funcmain(){rss:=make(chanfeed)for_,url:=rangedb.Feeds(){gogetFeeds(url,rss)}forrangedb.Feeds(){newFeed:=我的问题如下:当我直接打印newFeed变量时,它不会显示来自rsschannel的所有结果,只显示第一个。我好像必须超过db.Feeds()(RSS提要url列表)并打印包含gogetFe

go - 使用 channel 来调度任务以进行例程

我正在编写一个程序来渲染图表。Todo所以我正在搜索所有文件并希望将它们异步分派(dispatch)到go例程以并行处理它们。但是我想我误解了channel的概念。files:=umlFiles("uml")//listofstringsqueue:=make(chanstring)fori:=0;i这将在处理完前4个文件后陷入死锁,但不会继续处理其余文件。我可以使用channel将任务分派(dispatch)给正在运行的go例程并在所有任务完成后停止它们吗?如果是这样,上面的代码有什么问题?曾经到达这里:how-to-stop-a-goroutinego-routine-deadlo

go - channel 和并行混淆

我正在自学Golang,我对并行性及其在Golang中的实现方式有些困惑。给定以下示例:packagemainimport("fmt""sync""math/rand""time")const(workers=1rand_count=5000000)funcstart_rand(chchanint){deferclose(ch)varwgsync.WaitGroupwg.Add(workers)rand_routine:=func(counterint){deferwg.Done()fori:=0;i这段代码在我的Macbook上运行大约需要一分钟。我假设增加“workers”常量会启

go - 使用 channel 捕获 Goroutine 的输出和错误

我有一个调用函数的for循环runCommand()它在交换机上运行远程命令并打印输出。该函数在每次迭代时在goroutine中调用,我使用的是sync.Waitgroup同步goroutines。现在,我需要一种方法来捕获runCommand()的输出和任何错误作用于channel。我已经阅读了很多文章并观看了很多关于将channel与goroutines一起使用的视频,但这是我第一次编写并发应用程序,我似乎无法理解这个想法。基本上,我的程序从命令行获取主机名列表,然后异步连接到每个主机,在其上运行配置命令,并打印输出。如果出现错误,我的程序可以继续配置其余主机。我将如何以惯用的方式

go - 如何等待 goroutines 完成并在没有锁的情况下读取 channel ?

我在SO上查看了许多示例和问题,但仍然无法获得按预期工作的相当简单的代码:funcmain(){ch:=make(chanstring)varwgsync.WaitGroupwg.Add(2)goreadFile("A",ch,wg)goreadFile("B",ch,wg)gofunc(){wg.Wait()close(ch)}()printer(ch)}funcreadFile(namestring,chchanstring,wgsync.WaitGroup){file,err:=os.Open(name)iferr!=nil{fmt.Errorf("wasnotabletorea