背景介绍
环境
- 操作系统
- 本机:MacOS 15
- 远程: 阿里云封装的centos
- go版本
- 本机:go1.21.0
- 远程:go1.14.12
- IDE:GoLand
- 辅助:ChatGPT 4o
1 | $ cat /etc/os-release |
必做题
作业内容
使⽤任意并发⼯具,完成这样⼀个程序,并发请求 https://baidu.com 和 https://bing.com,任意⼀个站点先获取到了完整的 html,即中⽌另⼀个流程,并把结果输出⾄⽂件:{sitename}.html,例如百度先获取到了结果,即输出baidu.html,若 bing 先获取到了结果,就输出 bing.html。
作业分析
- 这里需要两个爬虫并行,那么肯定是需要起goroutine的
- 爬虫可能会超时,所以可以考虑设置一个带超时时间的context来做
- 两个爬虫一但一个完成,另一个需要马上中止,而
http.Get
方法是很难中止的,所以这里用了http.NewRequestWithContext
来实现 - 为了显式地看到另一个爬虫确实被中止了,这里用
sync.WaitGroup
来进行了一个等待 - 由于close时也可能报错,但同时又想作为defer处理,所以弄了个defer func,显式去修改返回的err值
实现
1 | package main |
运行结果
文件被写入,同时显式地可以看到另一个爬虫被中止
1 | http.Get err: Get "https://www.bing.com": context canceled |
选做一
作业内容
安装 herdtools (https://github.com/herd/herdtools7),在本机上使⽤ litmus7 执⾏下列脚本:
1 | X86 OOO |
并阅读明⽩输出结果,⽆需提交。
选做二
作业内容n
为什么使⽤ atomic.cas 可以实现⼀个互斥锁,为什么临界区内的内存读写操作不会被重排到 cas 操作之外?