Skip to content

Instantly share code, notes, and snippets.

@BeanSecurity
Created October 9, 2019 23:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BeanSecurity/82fa1f574b5bd8ab247d1c279799a3e6 to your computer and use it in GitHub Desktop.
Save BeanSecurity/82fa1f574b5bd8ab247d1c279799a3e6 to your computer and use it in GitHub Desktop.
Тестовое
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