草庐IT

GoRoutine

全部标签

go - 非阻塞 readline 挂起时泄漏 goroutine

假设您有这样的结构:ch:=make(chanstring)errCh:=make(chanerror)gofunc(){line,_,err:=bufio.NewReader(r).ReadLine()iferr!=nil{errCh在5秒超时的情况下,goroutine挂起直到ReadLine返回,这可能永远不会发生。我的项目是一个长期运行的服务器,所以我不想堆积卡住的goroutines。 最佳答案 在进程退出或方法读取一行之前,ReadLine不会返回。管道没有截止日期或超时机制。如果对ReadLine的调用在超时后返回,g

Goroutine 从未在 Linux 上执行但在 Windows 上正常工作

我是Go的新手。几小时后在谷歌上仍然找不到这个问题的解释。下面的代码在Windows上运行正常。它运行:0232A它会一直等待,但相同的代码在Linux(Ubuntu)上无法运行,goroutine从未执行过:023它会永远等待。packagemainimport("fmt")varexitbool=falsefuncmain(){fmt.Println("0")fmt.Println("2")gofunc(){fmt.Println("2A");}()fmt.Println("3")for{ifexit{break}}fmt.Println("4")}环境:LinuxUbuntu,g

go - 外部程序能否知道go程序中goroutine的个数?

我可以通过这个获取值“runtime.NumGoroutine()”..我可以知道外部程序中的goroutine数量吗? 最佳答案 也许你可以使用delve.去获取github.com/derekparker/delve/cmd/dlv运行你的主应用程序找到你的主应用程序的$piddlvattach$pid,然后键入goroutines以查看所有goroutines,如下所示:C:\work\gowork>dlvattach5696Type'help'forlistofcommands.(dlv)goroutines[5gorout

go - 我们应该在 goroutine 中同步变量赋值吗?

假设我声明了两个映射并想将其分配到错误组中的两个不同的goroutine中。我不执行任何读/写。我应该用lock保护分配操作还是可以忽略它?UPD3:在JavaConcurrencyInPracticeBrianGoetz's第一部分第3章共享对象,提到:Lockingisnotjustaboutmutualexclusion;itisalsomemoryvisibility.Toensurethatallthreadsseethemostup-to-datevaluesofsharedmutablevariables,thereadingandwritingthreadsmustsy

go - 启动 goroutine(即调用 'go')会失败吗?

执行gof会不会失败?go关键字没有返回值,高并发时如何判断一个goroutine是否启动成功?例如:packagemainimport("fmt""sync""time")funcmain(){varwg=&sync.WaitGroup{}gofunc(){//HowdoIknowifthereisanyfailurehere?wg.Add(1)fmt.Println("haloworld")wg.Done()}()time.Sleep(time.Nanosecond)wg.Wait()} 最佳答案 go语句不能失败(仅在内存不足

arrays - Golang 互斥范围遍及 goroutine 中的共享数组

假设我有以下代码:a:=[]int{1,2,3}i:=0varmu=&sync.Mutex{}fori数组是共享资源,正在循环中读取。如何保护循环header中的数组,我是否需要这样做?还有必要将数组作为指针传递给goroutine吗? 最佳答案 首先,一些Go术语:[]int{1,2,3}是一个slice,而不是一个数组。数组将写为[...]int{1,2,3}。slice是(start,length,capacity)的三元组并指向底层数组(通常是堆分配的,但这是语言完全向您隐藏的实现细节!)Go的内存模型允许任意数量的读取器或

go - 修改 goroutine 中的结构?

我正在试验goroutines,似乎我无法修改goroutine中结构的值(下面的示例)。有什么解决办法吗?编辑:如果我放置一个sleep语句,代码似乎会运行,这表明如果有更多时间goroutines会运行,但它们在main()中的所有内容都已经执行后完成运行。我如何“等待”我的goroutines在继续之前完成?packagemainimport("fmt")typenumstruct{valint}func(d*num)cube_val(){fmt.Println("changingvalue...")d.val=d.val*d.val*d.val}funcmain(){a:=[]

Goroutine并行执行确认

我是goroutines、channels之类的新手,如果这看起来微不足道,我深表歉意。我写了下面的代码:for_,h:=rangehosts{gofunc(){httpClient:=cleanhttp.DefaultPooledClient()//formattheURLwiththepassedhostandporurl:=fmt.Sprintf("https://%s:%v",h.Name,h.Port)//createavaultclientclient,err:=api.NewClient(&api.Config{Address:url,HttpClient:httpCli

go - 取消 HTTP 请求时关闭所有 goroutine

我正在制作一个网络爬虫。我通过爬虫函数传递url并解析它以获取anchor标记中的所有链接,然后我为所有这些url调用相同的爬虫函数,为每个url使用单独的goroutine。但是,如果在我收到响应之前发送请求并取消它,则该特定请求的所有groutine仍在运行。现在我想要的是,当我取消请求时,所有因该请求而被调用的goroutine都会停止。请指导。以下是我的爬虫函数代码。funccrawler(cecho.Context,urlRecstring,feedchanstring,urlList*[]string,wg*sync.WaitGroup){deferwg.Done()URL

go - 有没有办法在不创建新的 goroutine 的情况下回调函数?

我正在尝试在golang中实现Reliable-UDP。我需要实现的基本功能之一是数据包重传。最朴素的方法如下:发送数据包;创建一个计时器(也将创建一个新的goroutine)以检查在计时器触发之前是否收到ACK。这很简单,但是创建很多goroutine不是免费的。而且我认为TCP中的数据包重传的实现不会使用这种方法。那么,有没有办法在不创建新goroutine的情况下回调函数?我已经查看了golang-nuts(https://groups.google.com/forum/#!topic/golang-nuts/ja8j7wQUB-0)的帖子,但仍然找不到解决方案。