Skip to content

dmitryrpm/go-finder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задание

Процессу на stdin приходят строки, содержащие URL или названия файлов. Что именно приходит на stdin определяется с помощью параметра командной строки -type. Например, -type file или -type url. Каждый такой URL нужно запросить, каждый файл нужно прочитать, и посчитать кол-во вхождений строки "Go" в ответе.

В конце работы приложение выводит на экран общее кол-во найденных строк "Go" во всех источниках данных, например:

$ echo -e 'https://golang.org\nhttps://golang.org\nhttps://golang.org' | go run 1.go -type url
Count for https://golang.org: 9
Count for https://golang.org: 9
Count for https://golang.org: 9
Total: 27
$ echo -e '/etc/passwd\n/etc/hosts' | go run 1.go - type file
Count for /etc/passwd: 0
Count for /etc/hosts: 0
Total: 0

Каждый источник данных должен начать обрабатываться сразу после вычитывания и параллельно с вычитыванием следующего. Источники должны обрабатываться параллельно, но не более k=5 одновременно.

Обработчики данных не должны порождать лишних горутин, т.е. если k=1000 а обрабатываемых источников нет, не должно создаваться 1000 горутин.

Нужно обойтись без глобальных переменных и использовать только стандартные библиотеки.

Код должен быть написан так, чтобы его можно было легко тестировать. Формат предоставления решения: ссылка на github.

Реализация

>> go get github.com/dmitryrpm/go-finder

Запускаем 5 воркеров и 3 задания (загрузка по URL)

>> make run 

echo 'https://golang.org\nhttps://golang.org\nhttps://golang.org' | go run cmd/run/main.go -type url 
Count for https://golang.org: 9
Count for https://golang.org: 9
Count for https://golang.org: 9
Total: 27

Запускаем 1 воркер и 2 заданий (загрузка из файла)

>> make run_file flags="-k=1"

echo '/etc/passwd\n/etc/hosts' | go run cmd/run/main.go -type file -k=1
Count for /etc/passwd: 0
Count for /etc/hosts: 0
Total: 0

Тесты

>> make test flags="-cover"
go test ./... -cover -tags=integration
ok      github.com/dmitryrpm/go-finder/cmd/run  0.003s  coverage: 64.3% of statements
ok      github.com/dmitryrpm/go-finder/config   0.008s  coverage: 100.0% of statements
ok      github.com/dmitryrpm/go-finder/finder   0.007s  coverage: 97.5% of statements

About

MailRu Test

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published