如何解决此问题:恐慌:同步:负数 WaitGroup 计数器

2024年 2月 5日 32.6k 0

如何解决此问题:恐慌:同步:负数 waitgroup 计数器

问题内容

一次又一次运行后,我有时会遇到这个问题。我知道这与计数器相关。当调用sync.waitgroup的done()方法的次数多于调用add()方法的次数时,它将抛出此错误。

如何解决这个问题?

我的代码创建了大小为 4 的批次,并对每个批次进行一些处理,但我在解决此恐慌时遇到了问题。

package main

import (
"fmt"
"sync"
)

func main() {
// create input channel
input := make(chan int)

// create wait group
var wg sync.waitgroup

// start batcher goroutine
wg.add(1)
go batcher(input, &wg)

// send input values to the batcher
for i := 1; i 登录后复制

编写批处理程序的基本代码:

package main

import (
"fmt"
"sync"
)

func main() {
input := make(chan int)
output := make(chan []int)

var wg sync.waitgroup
wg.add(2)

// start the batcher goroutine
go func() {
batch := []int{}
for value := range input {
batch = append(batch, value)
if len(batch) == 4 {
output 0 {
output 登录后复制

Sum of batch [1 2 3 4]: 10
Sum of batch [5 6 7 8]: 26
Sum of batch [9 10]: 19

登录后复制

早期的设计有点复杂,我会尝试扩展这个基本设计。

正确答案

根据这段代码:

for i := 0; i 登录后复制

我认为 workerwg.done() 应该移到循环之外:

func worker(batch chan int, workerWg *sync.WaitGroup, done chan bool) {
+ defer workerWg.Done()
// process batches received from batch channel
for batch := range batch {
// process batch
fmt.Println("Processing batch:", batch)
- workerWg.Done()
}

// notify batcher goroutine that worker goroutine has finished
select {
case done 登录后复制

但是batch在demo中并没有关闭。所以事实上,goroutine 将永远运行,直到程序结束。

不知道是否还有其他问题。设计太复杂了。复杂的代码难以理解并且容易出错。考虑重新设计它。

以上就是如何解决此问题:恐慌:同步:负数 WaitGroup 计数器的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论