问题标签 [waitgroup]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
16 浏览

go - 在 go 例程开始后立即调用等待组?

https://go.dev/play/p/YVYRWSgcp4u

我在“开发人员的 Go 工具和技术中的并发性”中看到了这段代码,其中提到了广播的用法,上下文是使用广播来唤醒三个 gorouting。

我正在尝试了解订阅部分

作者说:

在这里,我们定义了一个便利函数,它允许我们注册函数来处理来自条件的信号。每个处理程序都在自己的 goroutine 上运行,并且在确认该 goroutine 正在运行之前订阅不会退出。

我的理解是,我们应该defer goroutingRunning.Done()在 gorouting 内部,以便后续代码(包括等待 Cond 和 fn() 调用,将有机会运行),但是在这种情况下,似乎goroutingRunning.Done()必须在 gorouting 的开头,否则它会导致死锁错误,但为什么呢?

0 投票
3 回答
155 浏览

go - 如何有效地并行化数组列表并控制并行度?

我有一个resourceId需要并行循环的数组。并URL为每个资源生成,然后放入一个映射中,该映射是键(resourcecId),值是 url。

我得到了下面的代码来完成这项工作,但我不确定这是否是正确的方法。我在这里使用sizedwaitgroup来并行化resourceId列表。并且在将数据写入地图时也使用锁定地图。我确信这不是有效的代码,因为使用 lock 然后使用 sizedwaitgroup 会有一些性能问题。

最好和最有效的方法是什么?我应该在这里使用频道吗?我想控制我应该拥有多少而不是运行resourceId列表长度的并行度。如果任何resourceIdurl 生成失败,我想将其记录为错误,resourceId但不要中断并行运行的其他 goroutine 以获取为 other 生成的 url resourceId

例如:如果有 10 个资源,其中 2 个失败,则记录这 2 个的错误,并且 map 应该有剩余 8 个的条目。

注意:上面的代码将从多个读取器线程中以高吞吐量调用,因此它需要执行良好。

0 投票
0 回答
43 浏览

go - 与 WaitGroup 的竞争条件

调用 WaitGroup 函数时出现竞争情况。据我了解(查看数据竞争报告),当第一个 wg.Add 调用由一个衍生的 goroutine 执行并且主例程同时调用 wg.Wait 时,就会发生竞争条件。它们同时做什么会导致数据竞争?为什么 Wait() 表现出写特性,而 Add() 表现出读特性?