2020-02-13 16:00:29 +00:00
|
|
|
|
## fetchall
|
|
|
|
|
|
|
|
|
|
В этой задаче нужно написать консольную утилиту,
|
|
|
|
|
которая принимает на вход произвольное количество http URL'ов и скачивает их содержимое **конкурентно**.
|
|
|
|
|
|
|
|
|
|
Программа не должна останавливаться на невалидном URL'e.
|
|
|
|
|
Текст ответов можно игнорировать.
|
|
|
|
|
Вместо этого можно залогировать прогресс в произвольном формате.
|
|
|
|
|
|
|
|
|
|
Пример:
|
|
|
|
|
```
|
2020-02-13 20:21:54 +00:00
|
|
|
|
$ fetchall https://gopl.io golang.org http://golang.org
|
2020-02-13 16:00:29 +00:00
|
|
|
|
Get golang.org: unsupported protocol scheme ""
|
|
|
|
|
1.05s 11071 http://golang.org
|
|
|
|
|
2.18s 4154 https://gopl.io
|
|
|
|
|
2.18s elapsed
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
В примере логируются времена обработки индивидуальных запросов, размеры ответов и общее время работы программы.
|
|
|
|
|
Можно видеть, что общее время работы равно максимуму, а не сумме времён индивидуальных запросов.
|
|
|
|
|
|
|
|
|
|
### Проверка решения
|
|
|
|
|
|
|
|
|
|
Для запуска тестов нужно выполнить следующую команду:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
go test -v ./fetchall/...
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Запуск программы
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
go run -v ./fetchall/main.go
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Компиляция
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
go install ./fetchall/...
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
После выполнения в `$GOPATH/bin` появится исполняемый файл с именем `fetchall`.
|
|
|
|
|
|
|
|
|
|
### Ссылки
|
|
|
|
|
|
|
|
|
|
1. Чтение аргументов командной строки: https://gobyexample.com/command-line-arguments
|
2020-02-14 10:26:46 +00:00
|
|
|
|
2. HTTP запрос: https://golang.org/pkg/net/http/
|
2020-02-13 16:00:29 +00:00
|
|
|
|
3. Запуск горутин: https://gobyexample.com/goroutines
|
|
|
|
|
4. Ожидание завершения горутин: https://gobyexample.com/channels
|
|
|
|
|
4. Замер времени: https://golang.org/pkg/time/#Since
|