shad-go/fetchall/README.md

58 lines
2.2 KiB
Markdown
Raw Normal View History

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`.
### Линтер
Установите [golangci-lint](https://github.com/golangci/golangci-lint), если вы ещё этого не сделали, и проверьте решение перед отправкой!
```
golangci-lint -v run ./fetchall/...
```
2020-02-13 16:00:29 +00:00
### Ссылки
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