并发编程最佳实践作业疑问
问题描述:
1、lock := make(chan content) 需要加buffer吗?试了一下不加程序也不会挂掉,加了是不是可以防止channel阻塞?
2、go fetch(name, lock) 协程里面执行http请求,如果http请求超时,会不会导致 c := <-lock 代码处阻塞?
3、下图代码还有没有其它问题?
相关代码:
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
type content struct {
name string
url string
body []byte
}
func main() {
urls := []string{
"baidu.com",
"bing.com",
}
lock := make(chan content)
for _, name := range urls {
go fetch(name, lock)
}
c := <-lock
writeToFile(c.name, c.url, c.body)
}
func fetch(name string, lock chan content) {
url := fmt.Sprintf("https://%s", name)
resp, err := http.Get(url)
if err != nil {
panic("request failed")
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic("Failed to read buffer data")
}
content := content{
name: name,
url: url,
body: body,
}
lock <- content
}
func writeToFile(name, url string, body []byte) {
if err := ioutil.WriteFile("./"+name+".html", body, 0644); err != nil {
panic("Failed to write to file")
}
}
22
收起
正在回答
1回答
按生产标准来写的话,你这里超时就会导致 goroutine 泄露~
生产环境向外发请求一定要加超时,不要直接用 http.Get 这种 API
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星