Junior — Middle
რის პირობებში ხორციელდება ბლოკირება სტანდარტული მონაცემთა გადაცემის არხთან მუშაობისას?
sobes.tech AI
პასუხი AI-სგან
Go-ში სტანდარტული მონაცემთა გადაცემის არხი ბლოკდება შემდეგ შემთხვევებში:
- როდესაც მონაცემს არხზე ვუგზავნით (
chan <- value), თუ არხს არ აქვს ბუფერი ან ბუფერი სავსეა, გამგზავნი გორუტინა ბლოკდება მანამ, სანამ სხვა ნაკადი არ წაიკითხავს მნიშვნელობას. - როდესაც არხიდან ვკითხულობთ (
value := <- chan), თუ არხი ცარიელია, წაკითხული გორუტინა ბლოკდება მანამ, სანამ მონაცემები არ გამოჩნდება.
ამით ბლოკირება ხდება, როდესაც ცდილობთ მონაცემების გაგზავნას სავსე არხზე ან ცარიელ არხიდან წაკითხვას, რაც უზრუნველყოფს გორუტინებს შორის სინქრონიზაციას.
მაგალითი:
ch := make(chan int) // ბუფერით არხი არაა
// გაგზავნა ბლოკდება, სანამ ვინმე არ წაიკითხავს
go func() {
ch <- 42
}()
მნიშვნელობა := <-ch // წაკითხვა გამორთავს გაგზავნას
fmt.Println(მნიშვნელობა)