- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
大家好,我正在从 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/
发件人:http://blog.nindalf.com/how-goroutines-work/ As the goroutines are scheduled cooperatively, a go
很多时候在用 Go 开发 http 服务器时,我都会遇到这种困境。 假设我想尽快用http statuscode 200响应客户端(然后在后面执行工作),这就是我通常这样做的原因: 我让我的主要 ht
这是代码: import "fmt" func main() { messages := make(chan string, 1) go func(c chan string) {
我正在学习 Golang,但遇到了一些困难。我已经研究过 Google,但没有任何进展。 我编写了一个代码,通过多台服务器的 ICMP 检查 RTT。 它有这样的结构: type Server str
我想运行多个 goroutine,进行一些处理,将结果放入 channel ,当至少有一个 goroutine 完成时,完成所有其他 goroutine 并从 channel 返回结果。 所以,我尝试
我有两个(但以后我会是三个)go 例程来处理来自远程服务器(来自 ampq channel )的传入消息。但是因为它们正在处理相同的数据/状态,所以我想阻止所有其他 go 例程,除了正在运行的例程。
我有一个案例,我从 2 个不同的位置(ES 和 REDIS)读取数据,我需要从最快的源读取一个值,因此我触发了 2 个 goroutines,一个从 ES 获取数据,其他从REDIS获取。 一旦从其中
像这里一样,我创建了一个 go playground 示例:sGgxEh40ev ,但无法正常工作。 quit := make(chan bool) res := make(chan int) go
我是golang的新手,正在研究goroutine。 我写了一个简单的代码,故意使用 goroutine 来划分数字。 首先,我给出基数并继续除它的数,直到它不能被整除 但是,我改变了go split
Main { go routine_1(carryout a time consuming task and return output) go routine_2(wait for output f
我想知道从另一个 goroutine 返回时调用的 goroutine 会发生什么。他们是继续运行还是被终止?这是一个示例代码来说明我的意思: func func() { // Doing s
更具体地说,在我的例子中,我有一个网络服务器和一个全局可访问的结构,网络服务器使用它来生成页面。我有另一个 Goroutine,它总是定期用新值更新该结构。这会引起问题吗?我是否需要实现一种机制来确保
来自 this file ,我不明白为什么函数startWorker会这样写: func (p *WorkerPool) dispatch() { for i := 0; i < p.maxW
我正在学习围棋,但在使用 goroutines 时遇到了问题。这是我的代码 package main import ( "fmt" "sync" "time" ) var co
我收到以下错误,我不明白为什么: 发送:查询 Herefatal 错误:所有 goroutines 都睡着了 - 死锁! 您可以看到我正在调用我使用 goroutine 创建的函数 routine。我
大家好,我正在从 Python3 过渡到 Go,所以我正在尝试重写我创建的库以获得更好的性能。 我面临一个问题,因为我是 Golang XD 中的新手,我使用有限的 API 下载数百个 json,我想
我有以下格式的脚本部分: func main() { for i=0;i<1000000;i++ { go test() } } func test() { a := test
package main func main() { c:=make(chan int) for i:=0; i<=100;i++ {
我正在学习 Go,我的第一个项目是一个简单的 ping 脚本。本质上,我想 ping 一堆 url,并在每个响应时等待 XXX 秒,然后再次 ping。这是删减的代码: func mai
这个问题在这里已经有了答案: Go all goroutines are asleep deadlock (2 个回答) fatal error: all goroutines are asleep
我是一名优秀的程序员,十分优秀!