Junior — Middle
Kā noteikt, kura no gorutīnām beigs darbu ar kanālu?
sobes.tech AI
Atbilde no AI
Go valodā nav tieša veida noteikt, kura gorutina aizvēra kanālu, jo kanāli nesatur informāciju par to, kas tos aizvēra. Tomēr parasti tiek izmantots šāds vienošanās:
- Gorutina, kas raksta kanālā, ir atbildīga par tā aizvēršanu.
- Lasīšanas gorutinas saņem signālu par aizvēršanu caur otro parametru lasot:
value, ok := <-ch. Jaok == false, kanāls ir aizvērts.
Lai uzzinātu, kura gorutina aizvēra kanālu, var izmantot papildu mehānismus, piemēram, sūtot strukturētas ziņas ar identifikatoriem caur kanālu vai izmantojot atsevišķus signāla kanālus vai kontekstus (context.Context) koordinācijai.
Piemērs:
ch := make(chan int)
// Gorutina, kas raksta un aizver kanālu
go func() {
defer close(ch)
ch <- 1
}()
// Gorutina, kas lasa
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Kanāls ir aizvērts")
}()
Šajā piemērā, pirmā gorutina aizver kanālu. Lai skaidri zinātu, kas to aizvēra, var pievienot žurnālu vai izmantot papildu signāla kanālus.