Я использую go 1.1 devel на Ubuntu 13.04.
go version devel +ebe8bca920ad Wed May 15 15:34:47 2013 +1000 linux/386
Согласно http://golang.org/doc/faq#goroutines
Когда сопрограмма блокируется, например, при вызове блокирующего системного вызова, среда выполнения автоматически перемещает другие сопрограммы в том же потоке операционной системы в другой исполняемый поток, чтобы они не были заблокированы.
Я пытаюсь написать загрузчик, который может загружать большие файлы по частям, используя горутины, и это лучшая горутина, которую я придумал:
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
Несмотря на то, что файлы загружаются и сохраняются правильно, я вижу, что второй фрагмент начинается только тогда, когда заканчивается первый.
Разве загрузки по частям не должны выполняться параллельно, или я что-то делаю не так?