问题内容
一次又一次运行后,我有时会遇到这个问题。我知道这与计数器相关。当调用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)其它相关文章!