-
-
Save BeanSecurity/82fa1f574b5bd8ab247d1c279799a3e6 to your computer and use it in GitHub Desktop.
Тестовое
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bufio" | |
"io/ioutil" | |
"log" | |
"net/http" | |
"os" | |
"strings" | |
) | |
func main() { | |
k := 5 | |
reader := bufio.NewReader(os.Stdin) | |
data := make([]byte, reader.Size()) | |
count, err := reader.Read(data) | |
urls := strings.Split(string(data[:count]), "\n") | |
urls = urls[:len(urls)-1] | |
if err != nil { | |
log.Fatalf("Problems reading urls: %s", err) | |
} | |
urlsCh := make(chan string, len(urls)) | |
resultsCh := make(chan int, len(urls)) | |
n := len(urls) | |
if len(urls) > k { | |
n = k | |
} | |
for i := 0; i < n; i++ { | |
go urlWorker(urlsCh, resultsCh) | |
} | |
for _, url := range urls { | |
urlsCh <- url | |
} | |
close(urlsCh) | |
amount := 0 | |
for _, _ = range urls { | |
amount += <-resultsCh | |
} | |
log.Printf("Total: %d", amount) | |
} | |
func urlWorker(urls chan string, results chan int) { | |
for url := range urls { | |
resp, err := http.Get(url) | |
if err != nil { | |
log.Println(err) | |
results <- 0 | |
continue | |
} | |
if resp == nil { | |
log.Println("aaa") | |
results <- 0 | |
continue | |
} | |
body, err := ioutil.ReadAll(resp.Body) | |
if err != nil { | |
log.Println(err) | |
results <- 0 | |
continue | |
} | |
n := strings.Count(string(body), "go") | |
log.Printf("Count for %s: %d", url, n) | |
results <- n | |
} | |
} | |
// Программа читает из stdin строки, содержащие URL. | |
// На каждый URL нужно отправить HTTP-запрос методом GET | |
// и посчитать кол-во вхождений строки "Go" в теле ответа. | |
// В конце работы приложение выводит на экран общее количество | |
// найденных строк "Go" во всех переданных URL, например: | |
// $ echo -e 'https://golang.org\nhttps://golang.org' | go run 1.go | |
// Count for https://golang.org: 9 | |
// Count for https://golang.org: 9 | |
// Total: 18 | |
// Каждый URL должен начать обрабатываться сразу после вычитывания | |
// и параллельно с вычитыванием следующего. | |
// URL должны обрабатываться параллельно, но не более k=5 одновременно. | |
// Обработчики URL не должны порождать лишних горутин, т.е. если k=5, | |
// а обрабатываемых URL-ов всего 2, не должно создаваться 5 горутин. | |
// Нужно обойтись без глобальных переменных и использовать только стандартную библиотеку. | |
// Код необходимо залить в публичный репозиторий github или на gist. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment