Sobes.tech
Junior — Middle

შეგიძლიათ მიაწოდოთ სცენარის მაგალითი, სადაც მონაცემების გადაცემისთვის ბუფერული არხი გამოიყენება?

sobes.tech AI

პასუხი AI-სგან

Go-დ ბუფერული არხი გამოიყენება, როდესაც საჭიროა მონაცემების გადაცემა goroutine-ებს შორის, მაგრამ არ უნდა ბლოკავდეს გამგზავნელს მაშინვე, თუ მიმღები ჯერ მზად არ არის მონაცემების მისაღებად. მაგალითად, სცენარში, სადაც მწარმოებელი ქმნის მონაცემებს უფრო სწრაფად, ვიდრე ისინი გადამუშავდება მომხმარებლის მიერ, ბუფერული არხი საშუალებას აძლევს რამდენიმე ელემენტის დაგროვებას, არ აძლევდა მწარმოებელს დაველოდოთ.

მაგალითი:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 3) // ბუფერი 3 ელემენტისთვის

    // მწარმოებელი
    go func() {
        for i := 1; i <= 5; i++ {
            fmt.Printf("გაგზავნა: %d\n", i)
            ch <- i // არ ბლოკავს, სანამ ბუფერი არ გაივსება
        }
        close(ch)
    }()

    // მომხმარებელი
    time.Sleep(time.Second) // დაგვიანების სიმულაცია
    for val := range ch {
        fmt.Printf("მიღებული: %d\n", val)
        time.Sleep(500 * time.Millisecond) // ნელი გადამუშავება
    }
}

ამ მაგალითში, მწარმოებელი შეუძლია პირველი 3 მნიშვნელობა გაუგზავნოს ბუფერულ არხს, ბლოკირების გარეშე, და შემდეგ დაელოდოს, სანამ მომხმარებელი თავისუფლდება ადგილი.