Ubuntu 13.04でgo 1.1 develを使用しています
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で入手できます。
ファイルは正しくダウンロードされ、保存されていますが、2 番目のチャンクは最初のチャンクが終了したときにのみ開始されることがわかります。
チャンク化されたダウンロードを並行して実行するべきではありませんか、それとも何か間違っていますか?