Sobes.tech
Junior — Middle

რის პირობებში ხორციელდება ბლოკირება სტანდარტული მონაცემთა გადაცემის არხთან მუშაობისას?

sobes.tech AI

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

Go-ში სტანდარტული მონაცემთა გადაცემის არხი ბლოკდება შემდეგ შემთხვევებში:

  • როდესაც მონაცემს არხზე ვუგზავნით (chan <- value), თუ არხს არ აქვს ბუფერი ან ბუფერი სავსეა, გამგზავნი გორუტინა ბლოკდება მანამ, სანამ სხვა ნაკადი არ წაიკითხავს მნიშვნელობას.
  • როდესაც არხიდან ვკითხულობთ (value := <- chan), თუ არხი ცარიელია, წაკითხული გორუტინა ბლოკდება მანამ, სანამ მონაცემები არ გამოჩნდება.

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

მაგალითი:

ch := make(chan int) // ბუფერით არხი არაა

// გაგზავნა ბლოკდება, სანამ ვინმე არ წაიკითხავს
go func() {
    ch <- 42
}()

მნიშვნელობა := <-ch // წაკითხვა გამორთავს გაგზავნას
fmt.Println(მნიშვნელობა)