I canali non bufferizzati bloccano i ricevitori finché i dati non sono disponibili sul canale. Non mi è chiaro come si comporta questo blocco con più ricevitori sullo stesso canale (ad esempio quando si usano le goroutine). Sono sicuro che tutti bloccherebbero finché non ci saranno dati inviati su quel canale.
Ma cosa succede dopo aver inviato un singolo valore a quel canale? Quale ricevitore/goroutine otterrà i dati e quindi sbloccherà? Tutti loro? Il primo in fila? Casuale?Più ricevitori su un singolo canale. Chi ottiene i dati?
risposta
Uno singolo casuale (non deterministico) lo riceverà.
Per impostazione predefinita, la comunicazione di goroutine è synchronous
e unbuffered
: le mandate non vengono completate finché un destinatario non accetta il valore. Ci deve essere un ricevitore pronto a ricevere dati dal canale e quindi il mittente può consegnarlo direttamente al ricevitore.
invio Così canale/ricezione operazioni di bloccare fino a quando l'altro lato è pronto:
1. Un'operazione di invio su un blocchi di canale fino a quando un ricevitore è disponibile per lo stesso canale: se non c'è destinatario per il valore su ch
, nessun altro valore può essere inserito nel canale. E viceversa: nessun nuovo valore può essere inviato in ch
quando il canale non è vuoto! Quindi l'operazione di invio attenderà fino a quando ch
sarà nuovamente disponibile.
2. Un'operazione di ricezione per un blocco di canali finché non è disponibile un mittente per lo stesso canale: se non c'è alcun valore nel canale, il ricevitore si blocca.
Ciò è illustrato nel seguente esempio:
package main
import "fmt"
func main() {
ch1 := make(chan int)
go pump(ch1) // pump hangs
fmt.Println(<-ch1) // prints only 0
}
func pump(ch chan int) {
for i:= 0; ; i++ {
ch <- i
}
}
Poiché non c'è ricevitore si blocca goroutine e stampare solo il primo numero.
Per risolvere questo problema, è necessario definire una nuova goroutine che legge dal canale in un ciclo infinito.
func receive(ch chan int) {
for {
fmt.Println(<- ch)
}
}
Poi nel main()
:
func main() {
ch := make(chan int)
go pump(ch)
receive(ch)
}
- 1. Django: i ricevitori del segnale possono restituire i dati?
- 2. come scrivere i dati sul canale socket
- 3. Hai un singolo menu su più pagine?
- 4. Interfaccia di richiamo WCF - Chi chiude il canale
- 5. JQuery ottiene i dati dall'array JSON
- 6. C'è un modo per aggiungere più ricevitori in Python SMTPlib?
- 7. Come può un ciclo singolo iterare su più array?
- 8. Puoi condividere i dati su più modelli?
- 9. Unione di più array su array singolo
- 10. i dati su più stringa di parola attraverso scanf()
- 11. Come posso eseguire più database Neo4j su un singolo server?
- 12. Chi possiede i controlli?
- 13. CERT SSL singolo su più server
- 14. Come ottenere i dati a chi invio un'email in iphone
- 15. Debug.WriteLine su "canale" diverso?
- 16. Come ottenere i dati relativi al canale da youtube api
- 17. Distribuzione di più servlet su un singolo server Tomcat
- 18. Come aggiungere più pulsanti su un singolo AlertDialog
- 19. Più contenitori docker come server Web su un singolo IP
- 20. Come si chiude un canale che inviano più goroutine?
- 21. più istanze di django su un singolo dominio
- 22. Sincronizza chat su più finestre/schede utilizzando l'API del canale AppEngine
- 23. visualizzare più punti di dati a singolo grafico
- 24. I futures sono eseguiti su un singolo thread? (Scala)
- 25. Scrittura su un singolo file da più thread in ruby
- 26. Rendering su un singolo oggetto Bitmap da più thread
- 27. Ruota più PDF e scrivi su un singolo PDF
- 28. Angular 2 - Gestione di più abbonamenti su un singolo osservabile
- 29. Differenza tra i ricevitori di servizi e broadcast in Android
- 30. sono più ricevitori di trasmissione legali legali in Android?
condizione Race? È sicuro farlo? –
Sì, certo, è proprio audace quale goroutine ottiene l'elemento. – inf
Non lo chiamerei "race condition". Questo termine è convenzionalmente definito per indicare un comportamento indesiderato a causa di un accesso concorrente non sicuro di una variabile. I canali sono progettati per l'accesso sicuro in contemporanea e non c'è nulla di sbagliato con più lettori su un canale non bufferizzato. – JimB