草庐IT

GoRoutine

全部标签

go - 我如何杀死一个协程

我有以下设置:funcstartsMain(){gomain()}funstopMain(){//killmain}funcmain(){//infiniteloop}我正在创建cucumber步骤,我需要能够启动和关闭应用程序。 最佳答案 您可以使用select和channel来终止无限循环!varquitchanstruct{}funcstartLoop(){quit:=make(chanstruct{})goloop()}funcstopLoop(){//AsmentionedbyKaedys//close(quit)//pe

go - 这台机器上最有效的 goroutines 数量

所以我确实有一个由我编写的并发快速排序实现。它看起来像这样:funcPartition(A[]int,pint,rint)int{index:=MedianOf3(A,p,r)swapArray(A,index,r)x:=A[r]j:=p-1i:=pfori我有一个sem缓冲channel,我用它来限制运行的goroutines的数量(如果它达到这个数量,我不会设置另一个goroutine,我只是在子数组上做普通的快速排序)。首先我从100开始,然后我更改为50、20。基准会稍微好一点。但是在切换到10之后,它开始倒退,时间开始变大。因此,至少对于我的硬件而言,有一些任意数字可以使算法

go - 这台机器上最有效的 goroutines 数量

所以我确实有一个由我编写的并发快速排序实现。它看起来像这样:funcPartition(A[]int,pint,rint)int{index:=MedianOf3(A,p,r)swapArray(A,index,r)x:=A[r]j:=p-1i:=pfori我有一个sem缓冲channel,我用它来限制运行的goroutines的数量(如果它达到这个数量,我不会设置另一个goroutine,我只是在子数组上做普通的快速排序)。首先我从100开始,然后我更改为50、20。基准会稍微好一点。但是在切换到10之后,它开始倒退,时间开始变大。因此,至少对于我的硬件而言,有一些任意数字可以使算法

web-services - 我如何将所有 goroutines 的数据/事件发布到 web 服务?

我的项目是一个TCP服务器(不是http)并且工作方式是这样的main(){for{conn,err:=listener.Accept()gohandleClient(conn,&Client{})}我通常有数百个客户端同时连接在handleconnection内部,我的“事件”看起来像这样IP1.2.3.4clientconnect1.2.3.4clientsendcommandXYZ1.2.3.4clientsenddataserversenddatato1.2.3.41.2.3.4clientsendcommandXYZ[repeatedNtimes]对于这些事件中的每一个,我想

web-services - 我如何将所有 goroutines 的数据/事件发布到 web 服务?

我的项目是一个TCP服务器(不是http)并且工作方式是这样的main(){for{conn,err:=listener.Accept()gohandleClient(conn,&Client{})}我通常有数百个客户端同时连接在handleconnection内部,我的“事件”看起来像这样IP1.2.3.4clientconnect1.2.3.4clientsendcommandXYZ1.2.3.4clientsenddataserversenddatato1.2.3.41.2.3.4clientsendcommandXYZ[repeatedNtimes]对于这些事件中的每一个,我想

go - 尝试使用 'range' 打印 channel 值后出现死锁

这是我在GoPlayground的代码packagemainimport("fmt")funcsum_up(my_intint,cschanint){my_sum:=0fori:=0;i结果是:136fatalerror:allgoroutinesareasleep-deadlock!而且我不明白导致错误的原因。我的理解是,在我的函数sum_up中,我正在向my_channel添加新值。为什么我尝试打印值后出现问题?由于我看到1、3、6被打印出来,这意味着所有goroutines都已成功完成。此外,如果尝试打印channel值的blockforele:=rangemy_channel{

go - 尝试使用 'range' 打印 channel 值后出现死锁

这是我在GoPlayground的代码packagemainimport("fmt")funcsum_up(my_intint,cschanint){my_sum:=0fori:=0;i结果是:136fatalerror:allgoroutinesareasleep-deadlock!而且我不明白导致错误的原因。我的理解是,在我的函数sum_up中,我正在向my_channel添加新值。为什么我尝试打印值后出现问题?由于我看到1、3、6被打印出来,这意味着所有goroutines都已成功完成。此外,如果尝试打印channel值的blockforele:=rangemy_channel{

go - 如果它阻塞,如何将 http.Serve 放在它自己的 goroutine 中?

http.Serve要么在调用时立即返回错误,要么在成功执行时阻塞。我怎样才能让它在它自己的goroutine中阻止它呢?我目前有以下代码:funcserveOrErr(lnet.Listener,handlerhttp.Handler)error{starting:=make(chanstruct{})serveErr:=make(chanerror)gofunc(){starting这似乎是一个好的开始并且在我的测试机器上工作,但我相信不能保证serveErr会在caseerr:=之前被调用因此,如果http.Serve,由于数据竞争导致结果不一致会产生错误。

go - 如果它阻塞,如何将 http.Serve 放在它自己的 goroutine 中?

http.Serve要么在调用时立即返回错误,要么在成功执行时阻塞。我怎样才能让它在它自己的goroutine中阻止它呢?我目前有以下代码:funcserveOrErr(lnet.Listener,handlerhttp.Handler)error{starting:=make(chanstruct{})serveErr:=make(chanerror)gofunc(){starting这似乎是一个好的开始并且在我的测试机器上工作,但我相信不能保证serveErr会在caseerr:=之前被调用因此,如果http.Serve,由于数据竞争导致结果不一致会产生错误。

golang 在 go 函数、goroutine 中打开的文件太多

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestionpackagemainimport("os""sync")funcmain(){varwgsync.WaitGroupwg.Add(1024*1024)fori:=0;i如果运行程序会出现如下错误。“打开$太多打开的文件”请告诉我们如何消除错误。