草庐IT

Goroutine-safe

全部标签

go - go中一个发生错误,关闭多个goroutine

考虑这个函数:funcdoAllWork()error{varwgsync.WaitGroupfori:=0;i在每个goroutine中,函数work()被调用10次。如果对work()的调用在任何正在运行的goroutine中返回错误,我希望所有goroutine立即停止,并退出程序。在这里使用os.Exit()可以吗?我该如何处理?编辑:这个问题不同于howtostopagoroutine在这里,如果一个错误发生,我需要关闭所有goroutines 最佳答案 您可以使用context为这样的事情创建的包(“带有截止日期,取消信

concurrency - 等待 n 个 goroutine 终止

我需要启动大量的goroutine并等待它们终止。直观的方式似乎是使用一个channel来等待它们全部完成:packagemaintypeObjectstruct{//data}func(obj*Object)Update(channelchanint){//updatedatachannel但问题在于对象的数量以及goroutine的数量可能会发生变化。是否可以更改channel的缓冲区大小?是否有更优雅的方式来做到这一点? 最佳答案 我用过WaitGroup作为这个问题的解决方案。翻译您当前的代码,并附上一些日志以明确发生了什么

concurrency - 等待 n 个 goroutine 终止

我需要启动大量的goroutine并等待它们终止。直观的方式似乎是使用一个channel来等待它们全部完成:packagemaintypeObjectstruct{//data}func(obj*Object)Update(channelchanint){//updatedatachannel但问题在于对象的数量以及goroutine的数量可能会发生变化。是否可以更改channel的缓冲区大小?是否有更优雅的方式来做到这一点? 最佳答案 我用过WaitGroup作为这个问题的解决方案。翻译您当前的代码,并附上一些日志以明确发生了什么

concurrency - 计算/显示事件 goroutine 的数量

我有一个队列和一个同时执行出队和入队的函数。我想确保队列中运行的goroutine数量正确,只要列表中有内容即可。这是我正在使用的代码,但我想知道是否有办法打印当前事件的goroutine的数量Linktoplaygroundvarelementintfuncdeen(queuechanint){element:= 最佳答案 有runtime.NumGoroutine但你接近这个错误。您的循环将不断生成goroutine。由于for循环,这将不必要地消耗CPU周期。一种方法是使用sync.WaitGroup。funcdeen(wg*

concurrency - 计算/显示事件 goroutine 的数量

我有一个队列和一个同时执行出队和入队的函数。我想确保队列中运行的goroutine数量正确,只要列表中有内容即可。这是我正在使用的代码,但我想知道是否有办法打印当前事件的goroutine的数量Linktoplaygroundvarelementintfuncdeen(queuechanint){element:= 最佳答案 有runtime.NumGoroutine但你接近这个错误。您的循环将不断生成goroutine。由于for循环,这将不必要地消耗CPU周期。一种方法是使用sync.WaitGroup。funcdeen(wg*

go - 是否有一些优雅的方式来暂停和恢复任何其他 goroutine?

就我而言,我有数千个goroutine同时作为work()工作。.我也有一个sync()协程。当sync开始,我需要任何其他goroutine在同步作业完成后暂停一段时间。这是我的代码:varchannels[]chanintvarchannels_mutexsync.Mutexfuncwork(){channel:=make(chanint,1)channels_mutex.Lock()channels=append(channels,channel)channels_mutex.Unlock()for{for{sync_stat:=现在的问题是,因为读取时总是阻塞,每次都转到syn

go - 是否有一些优雅的方式来暂停和恢复任何其他 goroutine?

就我而言,我有数千个goroutine同时作为work()工作。.我也有一个sync()协程。当sync开始,我需要任何其他goroutine在同步作业完成后暂停一段时间。这是我的代码:varchannels[]chanintvarchannels_mutexsync.Mutexfuncwork(){channel:=make(chanint,1)channels_mutex.Lock()channels=append(channels,channel)channels_mutex.Unlock()for{for{sync_stat:=现在的问题是,因为读取时总是阻塞,每次都转到syn

go - 如何在并发 goroutine 期间锁定/同步对 Go 中变量的访问?

在他对这个问题的回答中:GolangforWindowserraticbehavior?用户@distributed建议在并发goroutine上锁定/同步对共享变量的访问。我该怎么做?关于这个问题的更多信息:我得到这段代码(返回的函数在views上有一个闭包)同时在多个goroutine上运行:funcmakeHomeHandler()func(c*http.Conn,r*http.Request){views:=1returnfunc(c*http.Conn,r*http.Request){fmt.Fprintf(c,"Counting%s,%dsofar.",r.URL.Path

go - 如何在并发 goroutine 期间锁定/同步对 Go 中变量的访问?

在他对这个问题的回答中:GolangforWindowserraticbehavior?用户@distributed建议在并发goroutine上锁定/同步对共享变量的访问。我该怎么做?关于这个问题的更多信息:我得到这段代码(返回的函数在views上有一个闭包)同时在多个goroutine上运行:funcmakeHomeHandler()func(c*http.Conn,r*http.Request){views:=1returnfunc(c*http.Conn,r*http.Request){fmt.Fprintf(c,"Counting%s,%dsofar.",r.URL.Path

go - 所有 goroutine 都处于休眠状态 - 死锁

对于我的要求之一,我必须创建N个workergo例程,这些例程将由一个监控例程进行监控。当所有工作程序完成时,监控程序必须结束。我的代码以死锁结尾,请帮忙。import"fmt"import"sync"import"strconv"funcworker(wg*sync.WaitGroup,cschanstring,iint){deferwg.Done()cs 最佳答案 你的monitorWorker永远不会死。当所有工作人员完成后,它会继续等待cs。这种死锁是因为在cs上不会发送任何其他内容,因此wg永远不会达到0。一个可能的解决方