草庐IT

Concurrency

全部标签

http - 多线程Go for HTTP get

我在一个API中使用Go来获取我所在城市的公交车频率,但是当我尝试使HTTPGet访问许多URL时,我有点卡在了线程上。如果没有并发,程序需要超过16分钟才能完成1500个url调用以获取HTTP状态代码,我试图使用并发,但在阅读了很多帖子后我不明白goroutines是如何工作的......想法是制作一个函数并更改请求的数量,如下所示:gogetBusPostStatus(600,800)但我完全坚持...代码如下:packagemainimport("fmt""net/http""strconv""time")variint=0varconvStrstringvarmessage=

go - 中断当前的尾部并开始新的尾部

所以我在golang中创建了一些日志分析器,我需要的是新创建文件的实时tail-f。我正在使用tail包和fsnotify包,但我不太熟悉go中的channel和例程,所以我需要一些帮助。目前程序是这样的:packagemainimport("fmt""github.com/hpcloud/tail""strings""log""net/smtp""time""github.com/fsnotify/fsnotify")//thisfunctionneedstomonitorfornewfilesindirectoryfuncnewFileCheck()(newFilenamechan

go - goroutine 没有输出

当SayHello()按预期执行时,goroutine不打印任何内容。packagemainimport"fmt"funcSayHello(){fori:=0;i 最佳答案 当您的main()函数结束时,您的程序也会结束。它不会等待其他goroutine完成。引自GoLanguageSpecification:ProgramExecution:Programexecutionbeginsbyinitializingthemainpackageandtheninvokingthefunctionmain.Whenthatfunctio

go - 实现具有多个生产者的信号量(使用 goroutines)

这一直是我存在的祸根。typeec2Paramsstruct{sess*session.Sessionregionstring}typecloudwatchParamsstruct{clcloudwatch.CloudWatchidstringmetricstringregionstring}typerequeststruct{ec2ParamscloudwatchParams}//ControlconcurrencyandsyncvarmaxRoutines=128varsemchanboolvarreqchanrequestfuncmain(){sem:=make(chanbool

go - 如何避免同时打印字母数字的死锁

我是golang的新手,我只想打印出10个字母数字组合数字范围和字符范围的元素。我决定同时进行,但我遇到了有关死锁的错误。packagemainimport("fmt""math/rand""sync""time")typealphanumericstruct{anAlphabetstringaNumberstring}func(someStructalphanumeric)pairAlphanumeric()string{returnsomeStruct.aNumber+someStruct.anAlphabet}funcmain(){varwgsync.WaitGroupnumbe

go - 如何理解和实践Go的并发?

我正在学习Go,最强大的功能之一就是并发性。我以前写过PHP脚本,它们是逐行执行的,这就是为什么我很难理解channels和goroutines。是否有任何网站或任何其他资源(书籍、文章等)可以让我看到可以并发处理的任务,以便我可以用Go进行并发练习?如果最后我能看到带有评论和解释的解决方案,为什么我们这样做以及为什么这个解决方案比其他解决方案更好,那就太好了。举个例子,这是让我困惑的任务,我不知道如何处理:我需要做一个解析器,接收起点(例如:http://example.com),然后开始浏览整个网站(例如.com/about、example.com/best-hotels/等),并

go - 关闭一个 Go channel ,并同步一个 Go 例程

我无法在go中终止我的WaitGroup,因此无法退出范围循环。谁能告诉我为什么。或者更好的方法来限制go例程的数量,同时仍然能够在chan关闭时退出!我见过的大多数示例都与静态类型的channel长度有关,但此channel会因其他进程而动态调整大小。示例中的打印语句(“DONE!”)显示testValProducer打印了正确的次数,但代码从未到达(“--EXIT--”),这意味着wg.Wait仍然以某种方式阻塞.typeTestValContainerchanstringfuncStartFunc(){testValContainer:=make(TestValContainer

'A Tour of Go'的Crawl例子goroutine没有生效

正如“ATourofGo”的Crawl示例中提到的命中,我修改了Crawl函数,只是想知道为什么“goCrawl”无法生成另一个线程,因为只找到一个url被打印出来。我的修改有问题吗?如下列出我的修改,//Crawlusesfetchertorecursivelycrawl//pagesstartingwithurl,toamaximumofdepth.funcCrawl(urlstring,depthint,fetcherFetcher){//TODO:FetchURLsinparallel.//TODO:Don'tfetchthesameURLtwice.//Thisimpleme

go - 当我尝试模拟扇入时陷入僵局 - 通过阶乘计算扇出

我正在尝试具有阶乘问题的扇入-扇出模式。但我得到:fatalerror:allgoroutinesareasleep-deadlock!无法确定死锁的原因。我正在尝试使用扇入扇出模式同时计算100个数字的阶乘。packagemainimport("fmt")funcmain(){_inChannel:=_inListener(generator())forval:=range_inChannel{fmt.Print(val,"--")}}funcgenerator()chanint{//NEEDTOCALCULATEFACTORIALFOR100NUMBERSch:=make(chan

go - sync.WaitGroup传值引起的死锁?

有2种写重现的方法:第一种方式,程序干净退出。funcrecurse(depthint,wg*sync.WaitGroup){deferwg.Done()ifdepth==0{return}wg.Add(1)gorecurse(depth-1,wg)}funcmain(){wg:=sync.WaitGroup{}wg.Add(1)gorecurse(3,&wg)wg.Wait()}第二种方式,程序给出“fatalerror:allgoroutinesareasleep-deadlock!”funcrecurse(depthint,wgsync.WaitGroup){deferwg.Do