首页 > 其他 > 详细

《6.824 分布式系统学习随笔》(1)

时间:2020-03-01 09:28:13      阅读:102      评论:0      收藏:0      [点我收藏+]

《6.824 分布式系统学习随便》将会是一些列短的文章,记录我在学习MIT 6.824 2020 分布式系统中遇到的问题以及自己的思考。在学完本课程之后,希望有精力把零碎的问题系统整理出来。

问题背景

在Lecture 2-RPC and Threads中,老师提供了一段爬虫程序 crawler.go. 该程序实现了三种不同的爬虫实现方案,分别是

  1. 串行爬虫
  2. 通过共享状态和互斥锁实现的并发爬虫
  3. 通过通道实现的并发爬虫

在“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

1.不进行改动

2.去掉传进去的u

3.更改目标网址的内容

总结

《6.824 分布式系统学习随笔》(1)

原文:https://www.cnblogs.com/0x105/p/12387541.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!