【发布时间】:2013-05-20 04:50:37
【问题描述】:
我在 Ubuntu 13.04 上使用 go 1.1 开发
go version devel +ebe8bca920ad Wed May 15 15:34:47 2013 +1000 linux/386
根据http://golang.org/doc/faq#goroutines
当协程阻塞时,例如通过调用阻塞系统调用, 运行时自动将其他协程移动到同一 操作系统线程到不同的可运行线程,因此它们不会 被屏蔽。
我正在尝试编写一个下载器,它可以使用 goroutine 分块下载一个大文件 这是我想出的最好的 goroutine:
func download(uri string, chunks chan int, offset int, file *os.file) {
for current := range chunks {
fmt.println("downloading range: ", current, "-", current+offset)
client := &http.client{}
req, _ := http.newrequest("get", uri, nil)
req.header.set("range: ", fmt.sprintf("bytes=%d-%d", current, current+offset))
resp, err := client.do(req)
if err != nil {
panic(err)
}
defer resp.body.close()
body, err := ioutil.readall(resp.body)
if err != nil {
panic(err)
}
file.write(body)
}
}
完整的脚本可在https://github.com/tuxcanfly/godown/blob/master/godown.go获得
尽管文件已正确下载和保存,但我可以看到第二个块开始了 只有当第一个完成时。
分块下载不应该并行运行,还是我做错了什么?
【问题讨论】: