草庐IT

GoRoutine

全部标签

go - 从 goroutine 获取值并取消另一个 goroutine

我有一个案例,我从2个不同的位置(ES和REDIS)读取数据,我需要从最快的源读取一个值,因此我触发了2个goroutines,一个从ES获取数据,其他从REDIS获取。一旦从其中一个goroutine获取了数据,就必须完全取消另一个goroutine,以免浪费CPU。简化:funcA(){gofuncB(){}()gofuncC(){}()data:=现在一旦接收到数据,funcA或funcB必须取消,无论它们在做什么(我不再关心它们的输出,它们是只是在浪费CPU)最有效的方法是什么?可以仅使用channel来完成吗? 最佳答案

go - 改变 goroutine 休眠的时间

在Go中,我可以编写这样的代码来创建休眠5秒的gorouting。funcsleep(linkchaninterface{}){time.Sleep(5*time.Second)fmt.Println("I'vesleptfor5sec")link如果在main函数中我改变主意并决定sleep者应该睡5秒而不是3会怎样?如果goroutine已经开始休眠(并且休眠,例如1秒)怎么办?更新我的意思是,是否有东西让我可以在它休眠时管理那个独特的goroutine。比如向它发出减少或增加sleep时间的命令:funcmain(){//...time.Sleep(1)something.Man

go - 超时停止 goroutine 执行

我想在超时时停止goroutine执行。但它似乎对我不起作用。我正在使用iris框架。typeResponsestruct{datainterface{}statusbool}func(s*CicService)Find()(interface{},bool){ch:=make(chanResponse,1)gofunc(){time.Sleep(10*time.Second)fmt.Println("test")fmt.Println("test1")ch输出:Timedouttesttest1预期输出:Timedout有人可以指出这里缺少什么吗?它确实超时但仍然运行goroutin

go - 在 Go 中退出空流 http json goroutine 的解码

我有一个长期存在的流式json响应,我正在goroutine中处理,如下所示。我正在使用退出channel定期退出goroutine。在数据流动时(在下一个循环中)退出效果很好,但是,当没有流式传输时,decoder.Decode会阻止执行等待下一行json,这会阻止退出。关于如何优雅退出的建议?quit:=make(chanbool)decoder:=json.NewDecoder(response.Body)//response.Bodyisstreamingjsongofunc(){for{select{case 最佳答案 您

go - 使用 fan In 函数多路复用 Goroutine 输出

我试图实现一个示例Go代码,用于使用从go例程返回的channel,而main函数中没有任何“读取block”。在这里,一个fanIn函数接受来自其他两个例程的channel并返回它作为输入。此处,预期输出是来自两个内部例程的随机输出。但实际输出始终是一个“ann”后跟一个“john”,在任何情况下都不是随机的。为什么我没有得到随机输出?去Playground:http://play.golang.org/p/46CiihtPwD实际输出:yousay:ann,0yousay:john,0yousay:ann,1yousay:john,1......代码:packagemainimpo

go - 将恢复传递给上层 goroutine golang

我创建了一个示例,在该示例中我同时运行函数,在其中我会panic并恢复:packagemainimport"fmt"funcmain(){//"main"recoverydeferfunc(){ifr:=recover();r!=nil{fmt.Println("maingoroutinepaniced:",r)}}()//runningfunctionconcurrentlyinsidewhichIpanicchanStr:=make(chanstring)gofunc(){//this"internal"goroutinrecoverydeferfunc(){ifr:=recove

go - 关闭由 channel 链接的 goroutine 链的优雅方法是什么?

我是一名围棋学习者。为了更好地理解channel和goroutine的维护和供给,我正在尝试构建一个SieveofEratosthenes作为一组通过channel连接到管道中的goroutine。这是我目前所拥有的://esieveimplementsaSieveofEratosthenes//asaseriesofchannelsconnectedtogether//bygoroutinespackagemainimport"fmt"funcsieve(mineint,inchchanint){start:=true//First-numberswitchouch:=make(ch

xml - GoLang : Decompress bz2 in on goroutine, 在其他协程中消费

我是一名刚毕业的SWE,正在学习Go(并且喜欢它)。我正在为维基百科转储文件构建一个解析器——基本上是一个巨大的bzip2压缩XML文件(~50GB未压缩)。我想同时做流式解压和解析,听起来很简单。对于减压,我这样做:inputFilePath:=flag.Arg(0)输入阅读器:=bzip2.NewReader(输入文件)然后将读取器传递给XML解析器:解码器:=xml.NewDecoder(inputFile)但是,由于解压缩和解析都是昂贵的操作,我想让它们在单独的Go例程上运行以利用额外的核心。我将如何在Go中执行此操作?我唯一能想到的是将文件包装在一个chan[]byte中,并

go - 如何从 goroutine 结束一个 go 程序

我正在尝试在用go编写的命令行界面中实现一些非典型行为。我有一个运行很长时间的函数,我想要一个清理函数,当有人ctrl-c退出该函数时运行。这是代码的模型:funclongRunningFunction(){//somesetupstuffsigs:=make(chanos.Signal,1)signal.Notify(sigs,os.Interrupt,syscall.SIGINT,syscall.SIGTERM)gofunc(){在正常情况下,不需要使用ctrl-c,函数将正常完成。(正因为如此,在清理goroutine完成之前,我不能在主线程中有阻塞的东西(比如channel)。

Golang goroutine 不使用 channel 上使用范围的函数延迟运行

channel上的范围fors:=rangecs{fmt.Println("RecievedCake:",s)}应该保持函数打开直到channel关闭,此时函数/goroutine应该终止。当函数终止时,延迟函数应该先运行。事实并非如此,我也找不到任何原因。示例代码位于http://play.golang.org/p/ADu1MzAe9P按预期生成延迟语句,但从channel接收的函数除外。为什么会这样?有什么理由吗?谢谢! 最佳答案 defer函数不执行的原因是应用程序到达main函数的末尾导致整个程序在没有等待goroutine