发布时间:2024-11-22 00:25:26
var urls []string
2. 分配任务:接下来,我们需要根据CPU核心数或者自定义的并发数来分配任务。将任务队列中的URL列表按照一定的规则分配给不同的goroutine,这些goroutine会在后续的步骤中负责下载对应的文件。cpuNum := runtime.NumCPU()
tasks := make(chan string, len(urls))
for _, url := range urls {
tasks <- url
}
close(tasks)
var wg sync.WaitGroup
wg.Add(cpuNum)
for i := 0; i < cpuNum; i++ {
go downloadFile(tasks, &wg)
}
3. 下载文件:每个goroutine从任务队列中读取一个URL,并根据URL将对应的文件下载下来。可以使用Golang中的http.Get()方法来进行文件下载。func downloadFile(tasks chan string, wg *sync.WaitGroup) {
for url := range tasks {
resp, err := http.Get(url)
if err != nil {
fmt.Printf("Failed to download file: %v\n", url)
continue
}
defer resp.Body.Close()
... // 将文件写入磁盘等操作
}
wg.Done()
}
4. 等待任务完成:通过使用sync.WaitGroup来等待所有的goroutine完成下载任务。当任务队列中的URL都被处理完后,主函数会返回。wg.Wait()
四、总结 通过使用Golang中的goroutine和channel,我们可以很方便地实现多线程下载功能。在实际开发中,可以根据具体的需求对任务队列进行优化,例如使用缓冲channel来提高并发性能,或者对任务队列中的URL列表进行分片处理来减小内存消耗等。 五、参考链接 1. Golang官方文档:https://golang.org/ 2. Golang并发编程指南:https://golangbot.com/concurrency/ 3. Golang并发模型:https://golang.org/doc/effective_go.html#concurrency