-
Notifications
You must be signed in to change notification settings - Fork 179
Kadai3 2/yuonoda #22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Kadai3 2/yuonoda #22
Conversation
Kadai1 yuonoda
実際に分割ダウンロードができるようになっており全般的に要件が満たせているかと思いますが、キャンセルが発生した時の実装を行うという要件については満たせていなさそうです。具体的に何をしなければいけないかというとCtrl+Cを押した時でも、ちゃんと途中で作成した一時ファイルとかを消さなくてはいけないという事になります。 さらっと書いてありますが、osのシグナルをゴルーチンで監視して、割り込みが入った時適切に処理をするという事を書かなくてはいけず、そこそこタフな実装になるかと思います。私が実際にこの課題をやった時も上手く実装できなかったです…。 キャンセル処理を満たせてそうな参考になりそうな回答は人のもので恐縮ですが以下が良さそうです 参考にしていただければと思います! |
// リクエスト回数分受け付けてマージ | ||
var mu sync.Mutex | ||
d.Content = make([]byte, d.Size) | ||
for i := 0; i < d.BatchCount; i++ { | ||
eg.Go(func() error { | ||
select { | ||
case <-ctx.Done(): | ||
return ctx.Err() | ||
case pc := <-d.PartialContentCh: | ||
mu.Lock() | ||
utilities.FillByteArr(d.Content[:], pc.StartByte, pc.Body) | ||
mu.Unlock() | ||
} | ||
return nil | ||
}) | ||
} | ||
|
||
// 1リクエストでも失敗すれば終了 | ||
if err := eg.Wait(); err != nil { | ||
return err | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このあたりを中心に、OSから中断シグナルがきたときに、リクエストを中止するようにしました。
キャンセルもできるようになり、全般的によくなったかと思います!
1,3番目はdeferなので無視したいところですが、実際には一応こんな書き方で回避できるし問題があった時確認ができます。
二番目はgoroutineで呼ぶ関数なので、errorを返す関数ではなく、
を引数として渡してあげてエラーが発生した時このチャネルに送るようにした上で、後のセレクト部分を以下のようにすれば良さそうです。
最後は単純なハンドリング漏れですね。 ここ以外は私が見た限りでは完成されているように思います!! |
課題3-2「分割ダウンローダを作ろう」に回答しました。レビューなどいただけるとありがたいです。
テスト結果