Sobes.tech
Junior — Middle

Goroutine-ების ურთიერთქმედების კონტექსტში, ბუფერული არხი და ბუფერული არხის გარეშე არხის შორის რა განსხვავებაა?

sobes.tech AI

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

ბუფერული არხი (unbuffered channel) ბლოკავს გამგზავნს მანამ, სანამ მიმღები არ წაიკითხავს მნიშვნელობას, და პირიქით — მიმღები ბლოკირდება, სანამ მნიშვნელობა არ გამოჩნდება. ეს უზრუნველყოფს სინქრონიზაციას გორუტინებს შორის.

ბუფერული არხი (buffered channel) აქვს შიდა ფიქსირებული ზომის ბუფერი. გამგზავნი შეუძლია რამდენიმე მნიშვნელობის გამეორებით გაგზავნა, ბლოკირების გარეშე, სანამ ბუფერი არ აივსება. მიმღები შეუძლია წაიკითხოს მნიშვნელობები ბუფერიდან ბლოკირების გარეშე, თუ ბუფერი არ არის ცარიელი.

მაგალითი:

ch := make(chan int)        // ბუფერის გარეშე
chBuf := make(chan int, 2)  // 2 ელემტიანი ბუფერით

// ch <- 1  // ბლოკდება, თუ მიმღები არ არის
chBuf <- 1 // ბლოკდება, თუ ბუფერი არ არის სავსე

ამ გზით, ბუფერული არხები საშუალებას აძლევს უფრო მოქნილი მართვა სინქრონიზაციის და შეიძლება გაზარდოს შესრულების სიჩქარე, შემცირებით ბლოკირებების რაოდენობას.