Загрузка данных


package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup
	wg.Add(1)
	go func() {
		defer wg.Done()
		for i := 1; i <= 5; i++ {
			fmt.Println(i)
			time.Sleep(time.Second)
		}
	}()
	wg.Wait()
}
package main

import (
	"fmt"
	"sync"
)

func worker(jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
	defer wg.Done()
	for n := range jobs {
		results <- n * n
	}
}

func main() {
	jobs := make(chan int, 10)
	results := make(chan int, 10)
	var wg sync.WaitGroup

	for w := 0; w < 3; w++ {
		wg.Add(1)
		go worker(jobs, results, &wg)
	}
	for i := 1; i <= 10; i++ {
		jobs <- i
	}
	close(jobs) // сообщаем воркерам, что задач больше не будет

	wg.Wait()
	close(results)

	for r := range results {
		fmt.Println(r)
	}
}
package main

import (
	"fmt"
	"time"
)

func main() {
	tick := time.Tick(200 * time.Millisecond)
	for i := 1; i <= 15; i++ {
		<-tick // ждём следующий "тик", это и есть ограничение 5 в секунду
		fmt.Println("запрос", i, time.Now().Format("15:04:05.000"))
	}
}
package main

import (
	"fmt"
	"net/http"
	"sync"
)

func worker(urls <-chan string, wg *sync.WaitGroup) {
	defer wg.Done()
	for url := range urls {
		resp, err := http.Get(url)
		if err != nil {
			fmt.Println(url, "ошибка:", err)
			continue
		}
		fmt.Println(url, resp.Status)
		resp.Body.Close()
	}
}

func main() {
	list := []string{
		"https://go.dev", "https://github.com", "https://example.com",
		"https://yandex.ru", "https://google.com",
	}
	urls := make(chan string)
	var wg sync.WaitGroup

	for i := 0; i < 3; i++ {
		wg.Add(1)
		go worker(urls, &wg)
	}
	for _, u := range list {
		urls <- u
	}
	close(urls)
	wg.Wait()
}
package main

import (
	"crypto/md5"
	"fmt"
	"io"
	"os"
	"sync"
)

func hashFile(path string) (string, error) {
	f, err := os.Open(path)
	if err != nil {
		return "", err
	}
	defer f.Close()

	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		return "", err
	}
	return fmt.Sprintf("%x", h.Sum(nil)), nil
}

func worker(paths <-chan string, wg *sync.WaitGroup) {
	defer wg.Done()
	for p := range paths {
		sum, err := hashFile(p)
		if err != nil {
			fmt.Println(p, "ошибка:", err)
			continue
		}
		fmt.Println(p, sum)
	}
}

func main() {
	paths := make(chan string)
	var wg sync.WaitGroup

	for i := 0; i < 3; i++ { // не больше 3 открытых файлов одновременно
		wg.Add(1)
		go worker(paths, &wg)
	}
	for _, p := range os.Args[1:] {
		paths <- p
	}
	close(paths)
	wg.Wait()
}
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func search(name string, out chan<- string) {
	delay := time.Duration(rand.Intn(1000)) * time.Millisecond
	time.Sleep(delay)
	out <- fmt.Sprintf("результат из %s (за %v)", name, delay)
}

func main() {
	sources := []string{"база 1", "база 2", "API"}
	out := make(chan string, len(sources)) // с буфером, чтобы медленные горутины не зависли

	for _, s := range sources {
		go search(s, out)
	}

	select {
	case res := <-out:
		fmt.Println("первый:", res)
	case <-time.After(2 * time.Second):
		fmt.Println("таймаут")
	}
}
package main

import (
	"fmt"
	"sync"
)

type Manager struct {
	inc chan int
	get chan chan int
}

func NewManager() *Manager {
	m := &Manager{inc: make(chan int), get: make(chan chan int)}
	go func() {
		counter := 0 // состояние живёт только внутри этой горутины
		for {
			select {
			case d := <-m.inc:
				counter += d
			case reply := <-m.get:
				reply <- counter
			}
		}
	}()
	return m
}

func main() {
	m := NewManager()
	var wg sync.WaitGroup

	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			m.inc <- 1
		}()
	}
	wg.Wait()

	reply := make(chan int)
	m.get <- reply
	fmt.Println("счётчик:", <-reply) // 100
}
package main

import (
	"fmt"
	"sync"
)

func server(id int, requests <-chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for r := range requests {
		fmt.Printf("сервер %d обработал запрос %d\n", id, r)
	}
}

func main() {
	const n = 3
	servers := make([]chan int, n)
	var wg sync.WaitGroup

	for i := 0; i < n; i++ {
		servers[i] = make(chan int)
		wg.Add(1)
		go server(i+1, servers[i], &wg)
	}

	for req := 1; req <= 10; req++ {
		servers[(req-1)%n] <- req // по кругу: 1, 2, 3, 1, 2, 3...
	}
	for _, ch := range servers {
		close(ch)
	}
	wg.Wait()
}