ショートリストされている記事、私はMIT 6.824 2020分散システムを学んで発生した問題のいくつかのこと、自分の思考を記録しようとして「6.824だけの系統的な研究を分散します」。このコースの終了後、私たちは、断片化されたシステムの問題整理にエネルギーを持っていると思います。
背景問題
講演2-RPC及びスレッドで、教師は、いくつかのクローラ提供crawler.goを。プログラムが実装クローラの三つの異なる実装を、それぞれ、
- シリアル爬虫類
- 共有状態の同時実行爬虫類とミューテックスを通じて達成
- 同時は通路爬虫類によって達成しました
「2」では、このようなA部分コードがあります。
func ConcurrentMutex(url string, fetcher Fetcher, f *fetchState) {
fmt.Println(url)
f.mu.Lock()
already := f.fetched[url]
f.fetched[url] = true
f.mu.Unlock()
if already {
return
}
urls, err := fetcher.Fetch(url)
if err != nil {
return
}
var done sync.WaitGroup
for _, u := range urls {
done.Add(1)
go func(u string) {
defer done.Done() // defer保证了无论下一行函数是否正确执行,WaitGroup计数器都能-1,使done.Wait()可以不必一直等待
ConcurrentMutex(u, fetcher, f)
} (u)
}
done.Wait()
return
}
教室では、生徒が匿名関数を作ったgo func(u string) {...}
uは不変オブジェクトである文字列であるため、uが、行くを渡しません。実際には、不変の文字列は、文字列自体を指し不変であるが、私たちは、文字列の引用符を変更することができ、それは別の文字列を基準点です。だから、行くuの値を渡すことが必要です。
#TODO:次の三つの比較実験を行います