gpt4 book ai didi

go - 我如何等待对多个其他 Goroutines 的单个 Goroutine 响应?

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:16 27 4
gpt4 key购买 nike

大家好,我正在从 Python3 过渡到 Go,所以我正在尝试重写我创建的库以获得更好的性能。

我面临一个问题,因为我是 Golang XD 中的新手,我使用有限的 API 下载数百个 json,我想尽可能少地使用请求。所以在下载那些 jsons 时,一些使用的 URL 是重复的,我得到的第一个想法是在我的下载函数(goroutines)和每个 goroutine 之间传递一个 map[stringLink]*myJsonReceived 在下载之前检查链接是否已经被另一个 goroutine 处理,因此与其再次请求它并浪费带宽 + API 调用,不如等待其他 goroutine 完成下载并从字典中获取它。

我有几个选择:

1) goroutine 必须检查链接是否在 map 中,如果是的话,它每 0.05 秒检查一次字典中的指针是否仍然为 nil 或包含 json。 (可能是最糟糕的方法,但它有效)

2) 将 goroutine 之间传递的映射更改为 (map[stringlink]chan myjson) 这可能是最有效的方式,但我不知道如何将单个消息发送到 channel 并由多个等待的 Goroutine 接收它。

3) 我可以通过向结构添加一个计数器来使用选项 (2),每次 goroutine 发现已经请求了 url,它只是向计数器添加 +1 并等待来自 channel 的响应,当下载 goroutine 完成它会发送 X 消息到 channel 。但是这种方式会让我在 map 上添加太多的锁,这是对性能的浪费。

注意:我需要在所有函数执行结束时使用 map 将下载的 Json 保存到我的数据库中,以免再次下载它们。

预先感谢大家的帮助。

最佳答案

要解决您的任务,我会为此使用 goroutine 池。将有一个生产者在 channel 上发送 URL,而工作 goroutine 将在该 channel 上范围内接收要处理(获取)的 URL。一旦 URL 被“完成”,同一个 worker goroutine 也可以将其保存到数据库中,或者将结果传递到“collector”goroutine 的结果 channel 上,如果需要,它可以按顺序完成保存。

这种设计结构确保 channel 上发送的每个 URL 仅由一个 worker goroutine 接收,因此您不需要任何其他同步(在使用共享 map 的情况下您将需要)。有关 channel 的更多信息,请参阅 What are golang channels used for?

Go 支持 goroutines( channel )之间的通信而不是共享变量。引自 Effective Go: Share by communicating :

Do not communicate by sharing memory; instead, share memory by communicating.

有关如何创建工作池的示例,请参阅 Is this an idiomatic worker thread pool in Go?

关于go - 我如何等待对多个其他 Goroutines 的单个 Goroutine 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54854200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com