iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >如何解决此问题:恐慌:同步:负数 WaitGroup 计数器
  • 384
分享到

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

2024-02-05 22:02:43 384人浏览 泡泡鱼
摘要

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

问题内容

一次又一次运行后,我有时会遇到这个问题。我知道这与计数器相关。当调用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 <= 10; i++ {
        input <- i
    }

    // close input channel
    close(input)

    // wait for batcher goroutine to finish
    wg.wait()
}

func batcher(input chan int, wg *sync.waitgroup) {
    // create batch channel with buffer of size 4
    batch := make(chan int, 4)

    // create channel to synchronize worker goroutines
    done := make(chan bool)

    // create wait group for worker goroutines
    var workerwg sync.waitgroup

    // start worker goroutines
    for i := 0; i < 4; i++ {
        workerwg.add(1)
        go worker(batch, &workerwg, done)
    }

    // read input values and send to batch
    for value := range input {
        batch <- value
        if len(batch) == 4 {
            // wait for worker goroutines to finish processing batch
            workerwg.wait()

            // send batch to worker goroutines
            for i := 0; i < 4; i++ {
                workerwg.add(1)
                go sendbatch(batch, &workerwg, done)
            }
        }
    }

    // wait for worker goroutines to finish processing remaining batch
    workerwg.wait()

    // close done channel to notify that all batches have been processed
    close(done)

    wg.done()
}

func sendbatch(batch chan int, workerwg *sync.waitgroup, done chan bool) {
    // process batch
    for value := range batch {
        fmt.println("processing value:", value)
    }

    // notify worker goroutines that batch has been processed
    workerwg.done()

    select {
    case done <- true:
    default:
        // done channel has been closed
    }
}

func worker(batch chan int, workerwg *sync.waitgroup, done chan bool) {
    // 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 <- true:
    default:
        // done channel has been closed
    }
}

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

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 <- batch
                batch = []int{}
            }
        }
        if len(batch) > 0 {
            output <- batch
        }
        close(output)
        wg.done()
    }()

    // start the worker goroutine
    go func() {
        for batch := range output {
            sum := 0
            for _, value := range batch {
                sum += value
            }
            fmt.printf("sum of batch %v: %d\n", batch, sum)
        }
        wg.done()
    }()

    // send input values to the batcher
    for _, v := range []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} {
        input <- v
    }
    close(input)

    // wait for both goroutines to finish
    wg.wait()
}
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 < 4; i++ {
    workerwg.add(1)
    go worker(batch, &workerwg, done)
}

我认为 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 <- true:
    default:
        // done channel has been closed
    }
  }

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

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

以上就是如何解决此问题:恐慌:同步:负数 WaitGroup 计数器的详细内容,更多请关注编程网其它相关文章!

--结束END--

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

本文链接: https://www.lsjlt.com/news/561092.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决此问题:恐慌:同步:负数 WaitGroup 计数器
    问题内容 一次又一次运行后,我有时会遇到这个问题。我知道这与计数器相关。当调用sync.waitgroup的done()方法的次数多于调用add()方法的次数时,它将抛出此错误。 如何...
    99+
    2024-02-05
  • Go语言中的数组同步问题如何解决?
    在Go语言中,数组是一种常见的数据结构,它可以用来存储一组有序的元素。然而,当多个线程同时访问数组时,就会出现同步问题。这些问题包括数据竞争,死锁等。那么,Go语言中的数组同步问题如何解决呢? 本文将介绍Go语言中数组同步问题的几种解决方...
    99+
    2023-10-09
    数组 分布式 同步
  • NumPy 和 PHP:如何解决同步问题?
    在数据科学和机器学习领域,NumPy 是一个非常流行的 Python 库,用于高效处理大规模的数值数据。而在 Web 开发领域,PHP 是一种常用的编程语言,用于构建动态网站和 Web 应用程序。虽然它们是两种完全不同的技术,但在某些情况...
    99+
    2023-11-03
    numpy numy 同步
  • 如何解决Chrome浏览器同步暂停问题
    这篇文章给大家分享的是有关如何解决Chrome浏览器同步暂停问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Chrome浏览器同步暂停解决方法在浏览器中输入【chrome://flags/#account-co...
    99+
    2023-06-05
  • MySQL数据同步出现Slave_IO_Running: No问题的解决
    目录原因:解决办法:1:使用 find / -iname "auto.cnf" 命令查找你数据库的auto.cnf 配置文件。2:对这个配置文件的uuid进行更改。 3:重新启动mysql4...
    99+
    2023-05-12
    slave_io_running:no slave io running 为no slave-io-running是no怎么办
  • MySQL数据同步出现Slave_IO_Running: No问题的解决
    目录原因:解决办法:1:使用 find / -iname "auto.cnf" 命令查找你数据库的auto.cnf 配置文件。2:对这个配置文件的uuid进行更改...
    99+
    2023-05-19
    slave_io_running:no slave io running 为no slave-io-running是no怎么办
  • Python path 设置正确了吗?如何解决大数据同步问题?
    Python是一种高级编程语言,广泛用于数据分析、机器学习、人工智能等领域。在Python编程中,经常会遇到一个问题,那就是如何正确设置Python的path路径,以及如何解决大数据同步问题。本文将从这两个方面进行探讨,希望能够为大家提供...
    99+
    2023-10-12
    path 大数据 同步
  • 使用RedisAtomicInteger计数出现少计问题如何解决
    这篇“使用RedisAtomicInteger计数出现少计问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“使用Re...
    99+
    2023-07-04
  • mysql数据不同步如何解决
    mysql数据不同步的解决方法首先,对数据进行锁表,防止数据写入;flush tables with read lock; 对数据进行备份;mysqldump -uroot -p123456 --all-databases > /tmp/m...
    99+
    2024-04-02
  • pandas如何解决excel科学计数法问题
    目录pandas解决excel科学计数法问题亲测两个方法有效pandas替换科学计数法数字pandas解决excel科学计数法问题 excel默认处理超14位的数字成科学计数法,且后...
    99+
    2024-04-02
  • 如何解决js数字计算误差的问题
    这篇文章主要为大家展示了“如何解决js数字计算误差的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决js数字计算误差的问题”这篇文章吧。实例如下://...
    99+
    2024-04-02
  • 如何解决php无法计算浮点数问题
    这篇文章主要介绍如何解决php无法计算浮点数问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php无法计算浮点数是因为计算机底层二进制无法精确表示浮点数,其解决办法就是使用精准计算的类库或函数库,如使用php中的B...
    99+
    2023-06-25
  • Oracle数据不同步的问题分析和解决思路
    其实帮助很多的朋友解决过Oracle数据库数据不同步的问题,看似简单的问题分析出来的原因也是五花八门。比如: Oracle数据库问题的一点总结 在查看一些没有专业DBA维护的数据库的时...
    99+
    2024-04-02
  • 如何解决Vue相同路由不同参数的刷新问题
    这篇文章给大家分享的是有关如何解决Vue相同路由不同参数的刷新问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用vue和vue-router开发spa应用时,我们会遇到这样...
    99+
    2024-04-02
  • MySQL主从数据库同步延迟问题怎么解决
    这篇文章主要讲解了“MySQL主从数据库同步延迟问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL主从数据库同步延迟问题怎么解决”吧!My...
    99+
    2024-04-02
  • numpy和ASP:如何解决数据类型同步所带来的性能问题?
    在数据处理的过程中,我们常常需要使用不同的编程语言来处理不同的数据类型。这就带来了一个问题,就是如何解决数据类型同步所带来的性能问题。在本文中,我们将介绍如何使用numpy和ASP来解决这个问题,并且我们还将穿插一些演示代码来帮助读者更好...
    99+
    2023-10-30
    numpy 同步 数据类型
  • 如何解决C++数位DP复杂度统计数字问题
    小编给大家分享一下如何解决C++数位DP复杂度统计数字问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、问题描述:一本书的页码从自然数 1 开始顺序编码直到自然数 n 。书的页码按照通常的习惯编排, 每个页码不含多余的...
    99+
    2023-06-25
  • numpy和ASP:如何处理不同的数据类型同步问题?
    随着数据处理需求的增加,不同的数据类型之间同步的问题变得越来越重要。在这方面,numpy和ASP这两个工具是非常有用的工具。 首先,让我们了解一下numpy。numpy是一个Python库,它提供了一个强大的多维数组对象,以及许多用于操作这...
    99+
    2023-10-30
    numpy 同步 数据类型
  • Go语言并发编程中,如何解决同步问题?
    Go语言是一门比较新兴的语言,它在并发编程方面有很多的优势。然而,当我们进行并发编程时,我们会面临一个非常棘手的问题:同步。在本文中,我们将探讨在Go语言中解决同步问题的一些方法。 一、锁 在Go语言中,我们可以使用锁来解决同步问题。锁是...
    99+
    2023-06-16
    大数据 并发 同步
  • 如何解决OGG同步复制时与兼容触发器的问题
    这篇文章主要介绍了如何解决OGG同步复制时与兼容触发器的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 &...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作