草庐IT

GoRoutine

全部标签

select - 如何在选择的父级范围内运行的选择案例中调用 goroutine

我正在构建一个数据工具,用于收集流中的数据并对其进行操作。我有一个主例程,一个“进程管理器”,负责创建累积函数的新例程。经理被告知根据channel接收选择案例创建例程,该例程在无限循环中运行(我已经为自己和它创建的所有例程准备了取消例程)。问题是管理器需要能够在其主要范围内运行goroutine累加器,以便它们可以在select和for循环的范围之外运行(我希望它们在管理器接受新案例时继续运行)。cancel:=make(chanstruct{})chanchannel:=make(chanchandatatype)funcoperationManager(chanchannelch

multithreading - goroutine 池是否像其他语言中的线程池一样有意义?

我构建了一个简单的goroutine工作池,其中包含一些chan用于事件流,它工作得很好。由于goroutines的性质,我开始问自己这样做除了限制并发工作人员之外还有什么收获。gorutines他们自己没有任何他们在每次执行时重用的状态,因此保留它们是有值(value)的。所以问题是,启动goroutines并重用它们或者总是创建一个新的goroutines并限制同时创建/运行的数量是否有意义? 最佳答案 由于goroutine是一个执行函数,它可以被认为包含以下资源的集合:它执行的代码;Go运行时调度程序为该goroutine维

go - 具有多个 channel 的多个 goroutine 的死锁

我正在开发一个示例程序,使用具有多个channel的goroutine打印1到100之间的奇数之和和偶数之和。你可以找到我的代码here输出sumofevennumber=2550sumofoddnumber=2500fatalerror:allgoroutinesareasleep-deadlock!goroutine1[chanreceive]:main.print(0x434100,0x11db7c)/tmp/sandbox052575152/main.go:18+0xc0main.main()/tmp/sandbox052575152/main.go:14+0x120该代码有效

Goroutine 存储 channel 值没有死锁

此代码运行并结束时没有出现死锁错误。为什么?funcmain(){ch:=make(chanint)gofunc(){ch 最佳答案 无缓冲channel需要两个端点才能工作,所以让我们从正确的例子开始:packagemainfuncmain(){gofun2()这里fun2()发送两个值,main()接收两个值。您的示例代码只有一个端点,因此未正确构建channel,因此它是死锁,但是maingoroutines正常退出所以您看不到错误。这里,没有第二个终点,所以这是死锁:packagemainfuncmain(){varch=m

go - 写入具有多个 goroutine 的互斥映射是否比一个更快?为什么?

我有一个SyncMap定义如下:typeSyncMapstruct{sync.MutexMapmap[int]string}而且,现在我使用两种方式写入它,一种是goroutine,另一种是带互斥量的goroutine。代码如下:smap:=SyncMap{}smap.Map=make(map[int]string)t1:=time.Now()fori:=0;is2map:=SyncMap{}s2map.Map=make(map[int]string)t2:=time.Now()wg:=sync.WaitGroup{}wg.Add(2)gofunc(){deferwg.Done()fo

go - 创建 goroutine 并设置最大 goroutines

我正在学习Golang,但遇到了一些困难。我已经研究过Google,但没有任何进展。我编写了一个代码,通过多台服务器的ICMP检查RTT。它有这样的结构:typeServerstruct{iduintipstringrtttime.Duration}它有一个包含多个服务器的slice(它是一个数组吗?)。对于此slice中的每个服务器,我调用返回RTT的函数getRTT,然后将其存储在Server.rtt中,因为在for循环之后,我想打印所有服务器及其各自的RTT。for_,server:=rangeservers{server.rtt=getRTT(server.ip)/time.M

go - 如何检查goroutine是否创建成功?

在Go中,go是生成goroutine的关键字。但是,关键字似乎没有返回任何值,那么我如何检测goroutine是否正确生成?Go似乎使用以下方法来检查函数是否成功。value,err=myFunc(value)go关键字是否有类似的用法来检测创建错误?如果失败,go似乎会抛出运行时异常。我想做一个测试,找出我可以为一个CPU创建的最大goroutine数量。 最佳答案 如你所知:值,err=myFunc(value)是通过返回内置的error类型来处理异常的惯用方法。我想,在某种程度上,您可以将其与已检查的异常进行比较。但是,在您

使用 goroutine 阅读文本

我想用协程读取文本文件。从文件中读取的文本顺序无关紧要。如何并发读取文件?scanner:=bufio.NewScanner(file)forscanner.Scan(){lines=append(lines,scanner.Text())}例如,如果文本文件包含IlikeGo,我想读取这个文件而不考虑顺序。它可以是[]string{"Go","like","I"} 最佳答案 首先,如果您正在从io.Reader读取,请将其视为从流中读取。它是单一输入源,你不能“并行读取”,因为它的本质-在引擎盖下,你正在获取字节,等待另一个,再获

concurrency - Goroutine 和 for 循环

我想做的就是向channel发送一个值,然后从main()函数返回,并在从channelch.但这会一直运行下Go:ch:=make(chanint)for{gofunc(){ch从channel接收到一个值后,如何使用此for循环返回?为什么它会永远运行?Goplayground链接在这里http://play.golang.org/p/EvmT6Pw96Y 最佳答案 因为for循环永远运行,你的代码永远运行。从未到达for循环后从ch接收。如果你想让你的代码在某个时候退出,你必须在某个时候结束for循环,例如让它只运行一定数量的

tcp - 在 goroutine 中保持 TCP 连接有效,并在连接丢失时检查它是否超时

我有一个TCP服务器启动并运行监听一个端口和一个处理连接的例程。我想知道是否有可能为每个连接运行一个go例程,使它们通过net.SetKeepAlive(true)保持事件状态。还有错误处理,如果连接超时,它会执行清理功能,比如从列表中删除连接?处理例程:funchandleConnection(connnet.Conn,recchanstring){varitemQueItembuf:=make([]byte,bufSize)l,err:=conn.Read(buf)iferr!=nil||lTCP服务器:for{conn,err:=ln.Accept()iferr!=nil{fmt