如何在Golang中尽可能快速地启动Goroutine?
如何在Golang中尽可能快速地启动Goroutine? 我一直在开发一个终端应用程序,需要从1250个URL加载数据。目前我正在使用以下方法:
var wg = sync.WaitGroup
var lock = sync.RWMutex
for _, text := range urls {
time.Sleep(time.Millisecond * 1)
wg.Add(1)
go parseData(text, wg, lock)
}
wg.Wait()
func parseData(url string, wg sync.WaitGroup, lock sync.RWMutex) {
defer wg.Done()
defer lock.Unlock()
htmlBody := readHTML(url)
lock.Lock()
addToMap(htmlBody)
}
有没有更好的方法来启动这些Goroutine,让它们能够以连接允许的最快速度执行?如果不使用sleep函数,创建Goroutine的速度太快,会出现"too many connections"错误。
但是,如果我在readHTML函数周围加锁,让它们"同时"启动,获取所有数据的时间就会太长。
我注意到在这种用法中使用time.Sleep()函数时,偶尔HTML仍然会出错。这种情况很少见,大概100次中有1次,但仍然不可取。
欢迎提出任何想法,谢谢!
更多关于如何在Golang中尽可能快速地启动Goroutine?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
更多关于如何在Golang中尽可能快速地启动Goroutine?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
与使用互斥锁不同,您可能需要使用 sync.Map,而且无论如何都应该采用某种速率限制器,正如 @NobbZ 所说,这样可以避免因 URL 列表持续增长而导致资源过载。
找出你的连接限制并使用工作池。
我的假设是你达到了操作系统的文件描述符限制或者对方因为你的连接速度过快而拒绝连接。
编辑
除了工作池,你也可以使用其他速率限制方法,例如令牌桶实现。


