草庐IT

Waitgroup

全部标签

Goroutines、回调和 sync.WaitGroup

使用以下代码:packagemainimport("github.com/davecgh/go-spew/spew""sync""time")funccallbackWithTimeout(cbFuncfunc()([]byte,error),timeouttime.Duration){deferwg.Done()//Idon'twantthisfunctiontoknowaboutsync.WaitGrouptime.Sleep(timeout)d,e:=cbFunc()spew.Dump(d)spew.Dump(e)}varwgsync.WaitGroupfuncmain(){wg

go - 所有的 goroutines 都睡着了——僵局!与 WaitGroup

这是我的代码,我哪里出错了?funcmain(){intChan:=make(chanint)wg:=sync.WaitGroup{}fori:=0;i当我运行它时,我收到错误fatalerror:allgoroutinesareasleep-deadlock!这里是错误信息:goroutine1[semacquire]:sync.runtime_Semacquire(0xc0000120d8)C:/Go/src/runtime/sema.go:56+0x40sync.(*WaitGroup).Wait(0xc0000120d0)C:/Go/src/sync/waitgroup.go:

golang 中的递归在使用 goroutines、channels 和 sync.Waitgroup 时会产生死锁或负 WaitGroup 计数器

我正在尝试使用递归函数查找所有目录的列表。该函数的代码是funcFindDirs(dirstring,nativePartitions[]int64,wg*sync.WaitGroup,dirlistchanchanstring){//deferwg.Doneherewillgivenegativewaitgrouppanic,commentingitwillgivenegativewaitgroupcounterpanicfd,err:=os.Open(dir)iferr!=nil{panic(err)}filenames,err:=fd.Readdir(0)iferr!=nil{p

go - 使用 sync.WaitGroup 时获取 "fatal error: all goroutines are asleep - deadlock!"

我正在尝试拆分一组goroutine,然后等待它们全部完成。import"sync"funcdoWork(wgsync.WaitGroup)error{deferwg.Done()//Dosomeheavylifting...requestURL'sorsimilarreturnnil}funcmain(){varwgsync.WaitGroupfori:=0;i但是,当我运行这段代码时,出现以下错误:fatalerror:allgoroutinesareasleep-deadlock!goroutine16[semacquire]:sync.runtime_Semacquire(0x

go - 为什么这是 golang/waitgroup 中的一个僵局?

我不确定我错过了什么,但我遇到了死锁错误。我正在使用一个缓冲channel,在所有go例程完成后我会覆盖它。该channel的容量为4,我正在运行4个go例程,因此我希望它在达到最大容量后自动“关闭”。packagemainimport"fmt"import"sync"funcmain(){ch:=make(chan[]int,4)varm[]intvarwgsync.WaitGroupfori:=0;i 最佳答案 你有两个问题:由于您的channel太小,没有足够的空间容纳所有goroutines:当您的channel已满时,剩余

go - 使用具有外部功能的 sync.WaitGroup 的最佳方式

我对以下代码有一些问题:packagemainimport("fmt""sync")//Thisprogramshouldgoto11,butsometimesitonlyprints1to10.funcmain(){ch:=make(chanint)varwgsync.WaitGroupwg.Add(2)goPrint(ch,wg)//gofunc(){fori:=1;i我在指定的地方遇到了死锁。我尝试设置wg.Add(1)而不是2,它解决了我的问题。我认为我没有成功地将channel作为参数发送给Printer函数。有没有办法做到这一点?否则,我的问题的解决方案是将goPrint(

golang sync.WaitGroup 永远不会完成

我有以下代码获取URL列表,然后有条件地下载文件并将其保存到文件系统。文件是同时获取的,主goroutine等待所有文件被获取。但是,程序在完成所有请求后永远不会退出(并且没有错误)。我认为发生的事情是WaitGroup中的goroutines数量以某种方式增加太多而无法开始(通过Add)或者没有减少足够了(Done调用没有发生)。我明显做错了什么吗?我如何检查WaitGroup中目前有多少个go例程,以便我可以更好地调试正在发生的事情?packagemainimport("fmt""io""io/ioutil""net/http""os""strings""sync")funcmai

go - 可以安全地重用 sync.WaitGroup 吗?

sync.WaitGroup可以在Wait()被调用后重用吗?funcworker(whostring,in这个play.golang.org/p/QLsvA-b4Ae按预期运行,但能保证安全吗?文档没有这么说,但也许我只是偏执。 最佳答案 是的,它是安全的。事实上,它甚至比这更安全。您可以同时从多个goroutine中Wait,并根据您的用例交换Add和Done调用。只要Add发生在Wait之前,你应该是安全的。出于好奇,现在WaitGroup是用一个互斥体、两个int32s计数器和一个信号量实现的:typeWaitGroupst

go - 与 Channels 相比,sync.WaitGroup 的优势是什么?

我正在开发一个并发Go库,我偶然发现了两种不同的goroutine之间的同步模式,它们的结果相似:Waitgrouppackagemainimport("fmt""sync""time")varwgsync.WaitGroupfuncmain(){words:=[]string{"foo","bar","baz"}for_,word:=rangewords{wg.Add(1)gofunc(wordstring){time.Sleep(1*time.Second)deferwg.Done()fmt.Println(word)}(word)}//doconcurrentthingshere

go - sync.WaitGroup 的示例是否正确?

sync.WaitGroup的这个示例用法是否正确?它给出了预期的结果,但我不确定wg.Add(4)和wg.Done()的位置。使用wg.Add()一次添加四个goroutine有意义吗?http://play.golang.org/p/ecvYHiie0Ppackagemainimport("fmt""sync""time")funcdosomething(millisecstime.Duration,wg*sync.WaitGroup){duration:=millisecs*time.Millisecondtime.Sleep(duration)fmt.Println("Func