草庐IT

GC_concurrent

全部标签

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

concurrency - 使用共享 map 的不错的惯用方式

假设我有一个程序可以同时访问map,如下所示:funcgetKey(r*http.Request)string{...}values:=make(map[string]int)http.HandleFunc("/get",func(whttp.ResponseWriter,r*http.Request){key:=getKey(r)fmt.Fprint(w,values[key])})http.HandleFunc("/set",func(whttp.ResponseWriter,r*http.Request){key:=getKey(r)values[key]=rand.Int()}

concurrency - 使用共享 map 的不错的惯用方式

假设我有一个程序可以同时访问map,如下所示:funcgetKey(r*http.Request)string{...}values:=make(map[string]int)http.HandleFunc("/get",func(whttp.ResponseWriter,r*http.Request){key:=getKey(r)fmt.Fprint(w,values[key])})http.HandleFunc("/set",func(whttp.ResponseWriter,r*http.Request){key:=getKey(r)values[key]=rand.Int()}

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*

concurrency - Golang并发: how to append to the same slice from different goroutines

我有并发的goroutines想要将一个(指向一个)结构​​的(指针)append到同一个slice。你如何在Go中编写它以使其并发安全?这将是我的并发不安全代码,使用WaitGroup:varwgsync.WaitGroupMySlice=make([]*MyStruct)for_,param:=rangeparams{wg.Add(1)gofunc(paramstring){deferwg.Done()OneOfMyStructs:=getMyStruct(param)MySlice=append(MySlice,&OneOfMyStructs)}(param)}wg.Wait()

concurrency - Golang并发: how to append to the same slice from different goroutines

我有并发的goroutines想要将一个(指向一个)结构​​的(指针)append到同一个slice。你如何在Go中编写它以使其并发安全?这将是我的并发不安全代码,使用WaitGroup:varwgsync.WaitGroupMySlice=make([]*MyStruct)for_,param:=rangeparams{wg.Add(1)gofunc(paramstring){deferwg.Done()OneOfMyStructs:=getMyStruct(param)MySlice=append(MySlice,&OneOfMyStructs)}(param)}wg.Wait()