Immaginate il seguente codice:I rifiuti goroutini vengono raccolti insieme ai loro canali?
func waitForOneOfTwoProcesses() {
c := make(chan bool)
go func() {
time.Sleep(1 * time.Second)
c<-true
}()
go func() {
time.Sleep(2 * time.Second)
c<-true
}()
<-c
}
Fa questa perdita di un canale e un goroutine o fa andare riconoscono che c
non c'è più e il goroutine può uscire?
La risposta è diversa se il canale ha una dimensione del buffer pari a 2?
Così la scrittura per i blocchi di canale, anche se il canale è fuori portata e non può mai essere letto da ancora. Mi chiedo se sia un bug o una funzionalità. – AndreKR
Sì, l'invio verrà bloccato anche se non è presente un ricevitore. Il runtime può essere scritto per rilevare quando l'applicazione viene eseguita ricevendo su un canale in questo specifico esempio, ma non è qualcosa che il runtime può rilevare in generale. –
Come nota, è disponibile anche una "non-blocking send", che risolve questo problema esatto - avresti impostato il buffer sul canale su 1 e ognuno avrebbe inviato senza bloccare. Descritto più dettagliatamente qui: https://blog.golang.org/go-concurrency-patterns-timing-out-and –