问题标签 [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 投票
2 回答
63 浏览

go - Go 例程返回的结果少于实际结果

我有一个循环,它对给定的键进行哈希处理并返回结果,但是在结果上,如果我有 1500 个进入循环的 URL 列表,它永远不会返回 1500 的结果,它总是返回小于 1500。

我在下面做错了什么:

我尝试了这两种方法Add- 一个内部循环乘以 1,一个外部循环乘以总长度。

我希望函数返回所有 1500 个 URL 列表,而不仅仅是“700、977、1123”随机列表。

看起来 -wg.Wait()不是在等待所有wg.Add- 添加

0 投票
2 回答
63 浏览

go - 永远连续运行最多两个 goroutine

我正在尝试同时运行一个函数。它调用我的数据库可能需要 2-10 秒。我希望它完成后继续执行下一个例程,即使另一个例程仍在处理中,但只希望它一次最多处理 2 个。我希望这种情况无限期地发生。我觉得我快到,但是 waitGroup 强制这两个例程等到完成,然后再继续另一个迭代。

0 投票
1 回答
121 浏览

unit-testing - 对在其中启动 go 例程的函数进行单元测试

我有一个大致如下的代码库


我编写了与此类似的单元测试。

所有测试均成功。但是在执行命令时go test -v,我在代码中看到程序出现恐慌并给出的多个地方invalid memory address or nil pointer dereference。我在调试模式下检查了代码,并意识到问题出impl.GoRoutineWaitgroup.Add(1)在方法上validateMyFunction,当我注释掉go validateMyFunction(a,b)并再次运行测试时,日志中没有出现恐慌。那么我该如何解决这个问题呢?如何处理从内部启动 goroutine 的函数的单元测试(如本例所示)?

0 投票
1 回答
120 浏览

unit-testing - 如何检查是否在单元测试中调用了 sync.WaitGroup.Done()

假设我有一个函数,如果它作为 go 例程异步执行:

我将如何创建一个f确保wg.Done()被调用的单元测试?

一种选择是在调用wg.Done()之后直接调用测试f。如果f调用失败,wg.Done()测试会恐慌,这不好。另一种选择是创建一个接口,sync.WaitGroup但这似乎有点奇怪。

0 投票
0 回答
33 浏览

api - 生成文件时响应消息

我有一项服务,用户可以将数据导出到我在后端服务器上为他们生成的 excel 文件中。有时这些出口可能很大。因此,作为一种牢记用户体验的方法,我想确认服务器收到了请求并响应正在生成文档,并将在完成后通过电子邮件发送给他们。

这是迄今为止我所拥有的一个简单的例子。

代码:

当端点被击中时:

即使等待组在 ExportService 中并且不向处理程序返回任何内容,响应仍会等待生成完成,然后再以成功消息进行响应。

我想说我理解 Go 中的并发性,但我显然遗漏了一些东西。谁能帮我吗?

0 投票
1 回答
118 浏览

go - Go:负的 WaitGroup 计数器

我有点陌生,正在修改我在其他地方找到的代码以满足我的需求。正因为如此,我并不完全理解这里发生了什么,尽管我明白了一般的想法。

我正在使用 go 例程运行一些 websocket 客户端,但是我遇到了一个导致程序崩溃的意外错误。当从 websocket 读取消息时出错(检查 readHandler 函数中的 conn.ReadMessage() 函数),我的程序似乎关闭了太多线程(如果这是错误的术语,请原谅)。关于如何解决这个问题的任何想法?我非常感谢任何花时间浏览它的人。提前致谢!

0 投票
1 回答
39 浏览

go - 为什么在使用等待组和通道时会出现死锁?

我想使用setter函数将0-9发送到ch1通道,然后计算机函数将ch1中的数字平方,然后将结果发送到ch2通道。但是,运行此代码时我会感到恐慌。有人能解释为什么会发生这种情况,我完全糊涂了。

像这样的错误:

0 投票
1 回答
35 浏览

go - 即使 WaitGroup 实现存在问题,代码也会成功执行

我有这段代码,它使用输入和输出通道以及相关的 WaitGroups 同时运行一个函数,但我被告知我做错了一些事情。这是代码:

我已经在评论中指出我执行错误的地方。现在这些评论对我来说很有意义。有趣的是,这段代码确实看起来是异步运行的,并且大大加快了执行速度。我想了解我做错了什么,但是当代码似乎以异步方式执行时,我很难理解它。我很想更好地理解这一点。

0 投票
1 回答
54 浏览

go - 是否有另一种方法可以让 WaitGroup 显示该过程?

这是我运行整个工作人员的代码段

这是我的工人

当我在没有 WaitGroup 的情况下运行时,它只会创建我需要的整个文件中的一部分。但它显示了它的过程。它显示worker1做工作,worker2做工作等等......所以直到程序结束它会显示每一个。

否则,使用 waitgroup 它创建我需要的整个文件。但是,它完全合二为一,没有显示进程,显示当我用 WaitGroup 运行它时,它就像......等待整个过程在哪里xD,它刚刚以显示 Worker1 做工作,worker2 做工作等结束。 . 在程序结束时。

我可以用这个 Waitgroup 做些什么,让它显示它的每一个打印件?

0 投票
0 回答
67 浏览

go - 不可靠地终止生产工作的工人例行程序

为了更多地了解 Golang,我正在尝试从在线 5v5 视频游戏中获取比赛数据。

根据给定的玩家,我将请求他的匹配列表,并根据此匹配列表中的游戏 ID,我请求每个单独匹配的元数据。对这些比赛的所有参与者都应该这样做。

在工人范式术语中:从事 1 个工作可以创建多达 9 个额外的工作。

在这样做的过程中,我并行化这些调用工人 goroutine 的努力的方式在告诉工人何时停止方面似乎是不可靠的。

为此,我使用了一个终止标准,并让一个 goroutine 定期检查它。如果满足标准(例如 100 场比赛,或 10 名玩家从其中获取所有比赛),则应转发取消信号,告诉工人停止。

问题是,在当前的实施中,停止是非常不可靠的。通常,我最终会得到比定义更多的比赛或球员。在其他情况下,工作例程将简单地休眠并且永远不会完成。

当满足终止条件而不会超调时,如何实现停止所有 goroutine 的可靠方法?


“QueuePlayers”将所有接收到的参与者存储到一个数据结构中,告诉其他 goroutine 从哪个玩家抓取游戏,并定期检查是否满足终止标准。

“Crawl Players”获取给定玩家的匹配列表,获取其所有匹配并转发每个匹配“QueuePlayers”的参与者。在处理完一个玩家之后,表示它已经准备好让下一个玩家开始工作了。

为了定期检查终止标准,我尝试设置一个线程安全结构,该结构需要一个映射并将其添加为 Crawler 结构的成员。