《6.824 分布式系统学习随便》将会是一些列短的文章,记录我在学习MIT 6.824 2020 分布式系统中遇到的问题以及自己的思考。在学完本课程之后,希望有精力把零碎的问题系统整理出来。
在Lecture 2-RPC and Threads中,老师提供了一段爬虫程序 crawler.go. 该程序实现了三种不同的爬虫实现方案,分别是
在“2.” 中,有这样一部分代码:
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是string,即一个不可变对象。其实string的不可变是指string本身不可变,但是我们可以改变该string的引用,让它的引用指向另一个string。所以这里需要传u的值进去。
做了以下三个对比实验:#TODO
原文:https://www.cnblogs.com/0x105/p/12387541.html