jjzjj

goroutine

全部标签

go - 运行固定数量的 goroutines

我不完全确定这里发生了什么,所以很难概括我的问题,但我会尽力而为。在几年前的一段视频中,马特·帕克(MattParker)鼓励他的观众找出2的幂,其中不包含任何2的幂的数字。(例如,2^16=65536。这些数字都不是2的幂)。最近我开始学习Go,我认为这将是一个很好的入门练习来习惯这门语言。我很快就创建了这个,然后我决定尝试让它并发以充分利用我的四核处理器。这是事情走下坡路的地方。此处的目标是运行恒定数量的goroutine,每个goroutine处理不同批处理的数字。我是这样实现程序的:packagemainimport("log""math/big""runtime")//The

go sql driver + context canceled 似乎是 "leak"goroutines?

背景当我对我正在构建的应用程序运行负载测试时,一切都运行顺利,直到机器几乎耗尽内存并且应用程序遇到问题。突然所有上下文都被取消了(很可能被hystrix库取消了),因为处理请求的时间太长了。到目前为止,没有什么真正令人惊讶的。问题我确实觉得奇怪的是,当上下文被取消时,它似乎开始泄漏go例程。在健康状况下,大约有20个goroutine一直在运行。但是在这种情况发生之后,它会保留20多个goroutines:准确地说是98个。随着时间的推移,这个数字不会下降。我使用带有读/写超时的http.Server,带有上下文的go-sql-driver/mysql和hystrix。下面是gorou

go - 为什么这个 go 例程在关闭阻塞读取连接时随机无法退出?

为什么这个接收者在连接关闭时进入例程拒绝终止这按预期运行,但随后随机地,每调用20-10,000次,接收器将无法关闭,然后导致goroutine泄漏,导致100%cpu。注意:如果我记录所有错误,如果conn.SetReadDeadline被注释掉,我将在关闭的channel上看到读取。使用时,我将i/o超时视为错误。这运行了10k个周期,其中主进程启动了11对这样的发送/接收方,它们在主进程发送关闭信号之前处理了1000个作业。此设置在一夜之间运行了6小时以上而没有任何问题,达到10k个周期标记,但今天早上我无法让它运行超过20个周期而没有将接收器标记为未关闭和退出。funcsend

go - golang 中 server.GracefulStop() 的行为

我有一个gRPC服务器,我已经实现了像这样正常关闭我的gRPC服务器funmain(){//Somecodeterm:=make(chanos.Signal)gofunc(){iferr:=grpcServer.Serve(lis);err!=nil{term这很好用。相反,如果我在主goroutine中编写grpcServer.Serve()逻辑并将关闭处理程序逻辑放入另一个goroutine,则server.GracefulStop()之后的语句通常不会执行.如果完全执行closeDbConnections(),一些DbConnections将关闭。server.GracefulS

performance - 如何测量golang中函数的执行时间,不包括等待时间

我有一个需求来测量go中插件的执行时间(cpu成本),我们可以将插件视为函数,可能同时运行多个goroutine。更准确地说,执行时间应该排除空闲时间(goroutine等待时间),只有cpu获取时间(当前goroutine)。就像:gofunc(){//thisfuncisaplugin**starttorecordcpuacquiretimeofcurrentfunc/plugin/goroutine****runcode****stoptorecordcpuacquiretimeofcurrentfunc/plugin/goroutine**log.Debugf("Thisfun

go - 如何确保所有 goroutines 在没有 time.Sleep 的情况下终止?

这个问题在这里已经有了答案:Preventthemain()functionfromterminatingbeforegoroutinesfinishinGolang(4个答案)Nooutputfromgoroutine(3个答案)Goroutinedoesnotexecuteiftime.Sleepincluded(1个回答)关闭3年前。我正在尝试使用关于谁先收到消息的go例程。然而,当主goroutine终止时,一些goroutines仍然存在。我通过panic的堆栈跟踪看到了这一点。但是,如果我添加time.Sleep它们都会终止。我猜这是因为,当主要的go例程结束时,Go运行时

go - 退出工作池实现中的 channel

我最终想要完成的是根据工作量动态增加或减少我的工作人员。当任务通过w.Channel时,下面的代码成功解析数据func(s*Storage)StartWorker(w*app.Worker){gofunc(){for{w.Pool这里的阻塞点是下面这行。w.Pool从这个意义上说,如果我试图在我的程序的任何部分停止一个worker:w.Quitcase被阻止并且永远不会收到,直到w.Channel上有另一个传入任务(我猜这里的select语句对于每个案例选择都是随机的)。那么我怎样才能独立地停止一个channel(worker)呢? 最佳答案

sockets - 为什么当我在许多 goroutine 中发送一个 tcp shake packet(SYN) 时,我在每个 goroutine 中读取了很多响应包

我正在构建一个端口扫描器来检查远程机器上的某个TCP端口是否打开。为了提高性能,我只是构建一个TCPSYN数据包并将其发送到远程端口,而不是进行完整的3次握手。如果我成功接收到SYN-ACK数据包,那么该端口将被视为打开。这是我的部分代码:conn,_:=net.Dial("ip4:tcp",target)tcpSynPacket:=BuildTcpSynPacket()//hereIbuildatcpsynpacketconn.Write(tcpSynPacket.Marshal())deadlineTime:=time.NewTicker(time.Second*2)deferde

go - 尝试使用 go routines 时无法抓取数据

我正在尝试为我正在使用BFS的给定词抓取相关词,从给定词开始并在dictionary.com上搜索每个相关词我已经在没有并发的情况下尝试过这段代码,它工作得很好,但需要很多时间,因此尝试使用goroutines但我的代码在第一次迭代后卡住了。第一级BFS工作正常,但在第二级它挂起!packagemainimport("fmt""github.com/gocolly/colly""sync")varwgsync.WaitGroupfuncbuildURL(wordstring)string{return"https://www.dictionary.com/browse/"+string

go - 多个goroutine的调度

packagemainimport"fmt"funcsquare(cchanint){fmt.Println("[square]reading(4)")num:=输出:[main]main()started(1)[main]senttestNumtosquareChan(2)[cube]reading(3)[square]reading(4)[square]calc(5)[main]resuming(6)[main]senttestNumtocubeChan(7)[main]resuming(8)[main]readingfromchannels(9)backfrom[square](