问题标签 [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.
go - 在 go 例程开始后立即调用等待组?
https://go.dev/play/p/YVYRWSgcp4u
我在“开发人员的 Go 工具和技术中的并发性”中看到了这段代码,其中提到了广播的用法,上下文是使用广播来唤醒三个 gorouting。
我正在尝试了解订阅部分
作者说:
在这里,我们定义了一个便利函数,它允许我们注册函数来处理来自条件的信号。每个处理程序都在自己的 goroutine 上运行,并且在确认该 goroutine 正在运行之前订阅不会退出。
我的理解是,我们应该defer goroutingRunning.Done()
在 gorouting 内部,以便后续代码(包括等待 Cond 和 fn() 调用,将有机会运行),但是在这种情况下,似乎goroutingRunning.Done()
必须在 gorouting 的开头,否则它会导致死锁错误,但为什么呢?
go - 如何有效地并行化数组列表并控制并行度?
我有一个resourceId
需要并行循环的数组。并URL
为每个资源生成,然后放入一个映射中,该映射是键(resourcecId),值是 url。
我得到了下面的代码来完成这项工作,但我不确定这是否是正确的方法。我在这里使用sizedwaitgroup来并行化resourceId
列表。并且在将数据写入地图时也使用锁定地图。我确信这不是有效的代码,因为使用 lock 然后使用 sizedwaitgroup 会有一些性能问题。
最好和最有效的方法是什么?我应该在这里使用频道吗?我想控制我应该拥有多少而不是运行resourceId
列表长度的并行度。如果任何resourceId
url 生成失败,我想将其记录为错误,resourceId
但不要中断并行运行的其他 goroutine 以获取为 other 生成的 url resourceId
。
例如:如果有 10 个资源,其中 2 个失败,则记录这 2 个的错误,并且 map 应该有剩余 8 个的条目。
注意:上面的代码将从多个读取器线程中以高吞吐量调用,因此它需要执行良好。
go - 与 WaitGroup 的竞争条件
调用 WaitGroup 函数时出现竞争情况。据我了解(查看数据竞争报告),当第一个 wg.Add 调用由一个衍生的 goroutine 执行并且主例程同时调用 wg.Wait 时,就会发生竞争条件。它们同时做什么会导致数据竞争?为什么 Wait() 表现出写特性,而 Add() 表现出读特性?