From 7da51c6332e8f68ae4b3e235ec7bac41c08298c7 Mon Sep 17 00:00:00 2001 From: Igor V Belousov Date: Sun, 21 Nov 2021 01:03:10 +0300 Subject: [PATCH] Chapter 1 - fetchall.go (parallel get http page) --- ch1/fetchall.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ch1/fetchall.go diff --git a/ch1/fetchall.go b/ch1/fetchall.go new file mode 100644 index 0000000..d9bb043 --- /dev/null +++ b/ch1/fetchall.go @@ -0,0 +1,40 @@ +// Fetchall выполняет параллельную выборку ГКД и сообщает +// о затраченном времени и размере для каждого из них. +package main + +import ( + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "time" +) + +func main() { + start := time.Now() + ch := make(chan string) + for _, url := range os.Args[1:] { + go fetch(url, ch) // Запуск go-подпрограммы + } + for range os.Args[1:] { + fmt.Println(<-ch) // Получение из канала ch + } + fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds()) +} +func fetch(url string, ch chan<- string) { + start := time.Now() + resp, err := http.Get(url) + if err != nil { + ch <- fmt.Sprint(err) + return + } + nbytes, err := io.Copy(ioutil.Discard, resp.Body) + resp.Body.Close() + if err != nil { + ch <- fmt.Sprintf("while reading %s: %v", url, err) + return + } + secs := time.Since(start).Seconds() + ch <- fmt.Sprintf("%.2fs %7d %s", secs, nbytes, url) +}